c++ - QString 内部的 Qt QVarLengthArray

标签 c++ c arrays qt

QVarLengthArray 的内部数据结构是什么?

例如,如果我有:

QVarLengthArray<QString> anArray;

QString string1 = "whatever";
QString string2 = "something else";

anArray[0] = string1;
anArray[1] = string2;

给定 &anArray 预先计算 &anArray[1] 容易吗?

我一直在浏览 QVarLengthArray 源代码,试图了解 QVarLengthArray 如何在内存中存储 QString 数组。尽管我喜欢 Qt,但让我特别痛苦的一件事是它不透明的指针基础。 (调试器中的辅助函数在某些情况下有帮助,但当真正尝试深入内部时,不透明的指针掩盖了大量信息,否则这些信息将在调试器中可用。)

我在 codeproject.com 和其他地方找到了几篇“Qt Internals”文章,但没有任何帮助。

一般来说,如果有一种方法可以窥探不透明指针背后的真实数据结构,那就太好了,但是对于眼前的需要,了解是否有一种好的方法来预测每个指针的起始地址将是很好的MyClass 的 QVarLengthArray 中的元素,它包含指针、QString 和整数。

(了解此信息将有助于简化自定义序列化。我确实了解可重用性的风险,并且愿意为此实验接受这些风险。)

最佳答案

在类头的“私有(private)”部分下查找成员变量——这些会告诉您类结构。这是 QVarLengthArray 的第一个成员的链接:http://code.woboq.org/qt5/qtbase/src/corelib/tools/qvarlengtharray.h.html#QVarLengthArray::a

在 Qt 5 中,QVarLengthArray 以 2 个整数开头,后跟一个指向数组中第一个元素的指针,然后是一个包含实际数组本身的 union ,在堆栈上预先分配。

如果您的数组大小小于或等于预分配的容量,则 &(array[1]) 只是 &anArray 之后的固定字节数。但是,如果您的数组增长到大于预分配的容量,那么 QVarLengthArray 将切换到堆。发生这种情况时,&(array[1])&anArray 之间不再有任何关系。

如果你有&anArray,找到&(anArray[1])的可靠方法如下:

QString* anArray_0 = (&anArray)->begin(); // &(anArray[0])
QString* anArray_1 = anArray_0 + 1; // &(anArray[1])

或者,在不调用任何成员函数的情况下以低级方式执行此操作(假设没有填充):

// Use reinterpret_cast to enable 1-byte pointer arithmetic
char* outerPtr = reinterpret_cast<char*>(&anArray);

QString* anArray_0 = reinterpret_cast<QString*>( outerPtr + 2*sizeOf(int) ); // &(anArray[0])
QString* anArray_1 = anArray_0 + 1; // &(anArray[1])

(Having this information will help simplify a custom serialization. I do understand the risks to reusability and am willing to accept those risks for this experiment.)

Qt promise 跨次要版本的源代码和二进制兼容性。至少在 Qt 6 之前,保证 QVarLengthArray 的结构保持不变。

In general, it would be great to have a way to peer into the real data structures behind the opaque pointers

我找到了 Woboq Code Browser对此非常有用——源代码变成了一个交互式超链接网络,您可以在库中搜索任何类。只需在类标题中查找不透明指针,然后单击它即可。

关于c++ - QString 内部的 Qt QVarLengthArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25902864/

相关文章:

C++11:显式复制值以用作右值引用的最短方法

javascript - 展平由 JavaScript 中的嵌套元素分组的数组

javascript - JSON 数组响应中的总和值

javascript - 给定一个整数数组返回正数,其中存在等效的负数

C++11 QtCreator : long integer not correctly read into variable

c++ - 是否可以在 Linux 上编译 VST?

c++ - 哪个更好 : returning tuple or passing arguments to function as references?

C 程序使用 strtok 在字符串中查找单个单词

c++ - 如果数组全为 0(或 false),我可以在 C(++) 中检查吗?

c - 当我使用 GNU nm 时,它不显示 __DTOR_LIST__