C++ Qt QVarLengthArray QString内件

C++ Qt QVarLengthArray QString内件,c++,c,arrays,qt,C++,C,Arrays,Qt,QVarLengthArray的内部数据结构是什么 例如,如果我在哪里拥有: QVarLengthArray<QString> anArray; QString string1 = "whatever"; QString string2 = "something else"; anArray[0] = string1; anArray[1] = string2; QVarLengthArray-anArray; QString string1=“无论什么”; QString s

QVarLengthArray的内部数据结构是什么

例如,如果我在哪里拥有:

QVarLengthArray<QString> anArray;

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

anArray[0] = string1;
anArray[1] = string2;
QVarLengthArray-anArray;
QString string1=“无论什么”;
QString string2=“其他内容”;
anArray[0]=string1;
anArray[1]=string2;
预先计算&anArray[1]给定&anArray容易吗

我一直在研究QVarLengthArray的源代码,试图了解QVarLengthArray如何在内存中存储一组QString。虽然我很喜欢Qt,但有一件事让我特别痛苦,那就是它的不透明指针基础。(调试器中的helper函数在某些情况下会有所帮助,但当真正尝试深入内部时,不透明指针会掩盖调试器中可用的大量信息。)

我在codeproject.com和其他网站上找到了几篇“Qt内部”文章,但没有一篇有用

总的来说,能够窥探不透明指针背后的真实数据结构是很好的,但是对于当前的需要,了解是否有一种好的方法来预测MyClass的QVarLengthArray中每个元素的起始地址(包含指针、qString和整数)是很好的

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

在类标题的“private”部分下查找成员变量,这些变量将告诉您类结构。以下是QVarLengthArray第一个成员的链接:

在Qt5中,QVarLengthArray以2个整数开始,后跟指向数组中第一个元素的指针,后跟一个保存实际数组本身的并集,该并集在堆栈上预先分配

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

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

QString* anArray_0 = (&anArray)->begin(); // &(anArray[0])
QString* anArray_1 = anArray_0 + 1; // &(anArray[1])
或者,在不调用任何成员函数(假设没有填充)的情况下,以低级方式执行此操作:

//使用reinterpret\u cast启用1字节指针算法
char*outerpr=重新解释强制转换(&A);
QString*anArray_0=重新解释强制转换(outerpter+2*sizeOf(int));//&(数组[0])
QString*anArray_1=anArray_0+1;//&(阿纳雷[1])
(拥有这些信息将有助于简化自定义序列化。我确实理解可重用性的风险,并且愿意接受这些风险。)

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

一般来说,如果有一种方法可以窥探不透明指针背后的真实数据结构,那就太好了

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

在类标题的“private”部分下查找成员变量——这些变量将告诉您类结构。以下是QVarLengthArray第一个成员的链接:

在Qt5中,QVarLengthArray以2个整数开始,后跟指向数组中第一个元素的指针,后跟一个保存实际数组本身的并集,该并集在堆栈上预先分配

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

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

QString* anArray_0 = (&anArray)->begin(); // &(anArray[0])
QString* anArray_1 = anArray_0 + 1; // &(anArray[1])
或者,在不调用任何成员函数(假设没有填充)的情况下,以低级方式执行此操作:

//使用reinterpret\u cast启用1字节指针算法
char*outerpr=重新解释强制转换(&A);
QString*anArray_0=重新解释强制转换(outerpter+2*sizeOf(int));//&(数组[0])
QString*anArray_1=anArray_0+1;//&(阿纳雷[1])
(拥有这些信息将有助于简化自定义序列化。我确实理解可重用性的风险,并且愿意接受这些风险。)

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

一般来说,如果有一种方法可以窥探不透明指针背后的真实数据结构,那就太好了

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

在类标题的“private”部分下查找成员变量——这些变量将告诉您类结构。以下是QVarLengthArray第一个成员的链接:

在Qt5中,QVarLengthArray以2个整数开始,后跟指向数组中第一个元素的指针,后跟一个保存实际数组本身的并集,该并集在堆栈上预先分配

如果数组大小小于或等于预先分配的容量,则
&(数组[1])
只是
&anArray
之后的固定字节数。但是,如果您的阵列增长大于预先分配的容量,那么QVarLengthArray将改为切换到堆。当这种情况发生时