QVarLengthArray的内部数据结构是什么?
例如,如果我在哪里有:
QVarLengthArray<QString> anArray;
QString string1 = "whatever";
QString string2 = "something else";
anArray[0] = string1;
anArray[1] = string2;
预先计算和弄乱[1]给定和弄乱是否容易?
我一直在跟踪QVarLengthArray源代码,试图了解QVarLengthArray如何在内存中存储qstring数组。尽管我很喜欢Qt,但有一件事让我特别痛苦,那就是它不透明的指针基础。(在某些情况下,调试器中的helper函数会有所帮助,但当真正尝试深入了解内部时,不透明指针会隐藏调试器中本来可用的大量信息。)
我在codeproject.com和其他网站上发现了一些“Qt内部”的文章,但没有任何帮助。
一般来说,有一种方法可以窥视不透明指针后面的真实数据结构是很好的,但是对于当前的需要,如果有一种好的方法可以预测包含指针、qstring和整数的MyClass的QVarLengthArray中每个元素的起始地址,就很好了。
(拥有这些信息将有助于简化自定义序列化。我确实了解可重用性的风险,并愿意接受这些风险。)
最佳答案
在类标题的“private”部分下查找成员变量——这些变量将告诉您类结构。以下是QVarLengthArray第一个成员的链接:http://code.woboq.org/qt5/qtbase/src/corelib/tools/qvarlengtharray.h.html#QVarLengthArray::a
在Qt 5中,QVarLengthArray以2个int开头,后面是指向数组中第一个元素的指针,后面是一个联合,它保存实际数组本身,预先分配在堆栈上。
如果数组大小小于或等于预先分配的容量,那么&(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])
(拥有这些信息将有助于简化自定义序列化。我确实了解可重用性的风险,并愿意接受这些风险。)
Qt承诺在小版本中实现源代码和二进制代码的兼容性。QVarLengthArray的结构保证至少在Qt6之前保持不变。
一般来说,有一种方法可以窥视不透明指针后面的真实数据结构是很好的
我发现Woboq Code Browser对此非常有用--源代码变成了一个超链接的交互式web,您可以在库中搜索任何类。只需在类标题中查找不透明指针,然后单击它。
关于c++ - Qt QVarLengthArray的QString内部,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25902864/