繁体   English   中英

增加向量中结构的大小会发生什么?

[英]What happens when you increase the size of a struct in a vector?

我正在处理的一个问题涉及一个大的树结构。 最初我是通过new新节点并将它们附加到父节点等来创建树。 这花了很长时间。 一位朋友建议我放弃动态内存分配,并将树结构化为具有子字偏移量的数组。 我之前没有这样做过,所以我对实际发生的事情有一些疑问。

这是超基本的,没有任何安全检查的例子:

struct DataStructure
{
    std::vector<Entry> mCollection;
};

struct Entry
{
    char mValue;
    std::vector<unsigned int> mOffsetCollection; //a vector of indexes that are offsets to other entries.
};

我很好奇当我向这个结构添加更多数据时会发生什么。 如果我加了

DataStructure d;
Entry entry;
entry.mValue = 'a';
d.push_back(entry);
.
.
.//add some more entries...
.
.
//now suppose I add a bunch of offsets to these various entries in my array.
Entry& firstEntry = d.at(0);
firstEntry.mOffsetCollection.push_back(4);
firstEntry.mOffsetCollection.push_back(9);
firstEntry.mOffsetCollection.push_back(32);
..

所以第一个条目的大小正在增加。 究竟发生了什么? 我刚刚通过一个小例子,似乎工作正常。 数据结构中的其他条目不受影响。 我最初担心的是,如果结构的大小变大,它可能会遇到阵列中的下一个项目,但我想这不会发生。 这让我意识到我真的不知道幕后发生了什么。 vector<Entry>DataStructure d具有重新分配存储器?

是的, std::vector动态管理自己的内存。

结构的大小(实际上,任何数据类型)在编译时是固定的; 它在运行时不受影响。

您没有使用动态分配,但矢量类是。 内部vector<int>将其可变长度数组存储在您放入外部向量的Entry对象的外部。

std::vector的大小是常量,因为它在内部使用指向堆块的指针存储数据,通常它有一个开始,结束和当前指针,而不是其他很多,使它也很小。

这可能看起来很挑剔,但你选择的措辞会让我失望,我怀疑它可能会让你失望......

增加向量中结构的大小会发生什么?

请记住, struct 本身的大小永远不会改变,任何结构在运行时也不会改变大小。

如果你在程序开头做sizeof(DataStructure) ,然后再推回一堆东西并再次执行sizeof(DataStructure) ,结果将完全相同。 这是因为你推回数据不是部分 DataStructure iself,而是由一些指向 DataStructure

我在说什么指针? vector vector也永远不会改变大小 - 但它内的项目数量确实如此。 vector管理指向一些动态分配的东西的指针,这些东西正在推回。 随着你推回更多的东西,托管阵列填满了。 当托管数组最终满载capacity()vector必须分配一个新的更大的数组并将你的东西复制到它(这就是为什么包含STL的对象必须是“可复制的”)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM