gpt4 book ai didi

c++ - QString 内部的 Qt QVarLengthArray

转载 作者:太空宇宙 更新时间:2023-11-04 07:14:35 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com