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

| 我正在处理的问题涉及大型树结构。最初,我是通过“ 0”新节点并将它们附加到其父节点等来创建树的。这花了很长时间。一位朋友建议我放弃动态内存分配,并将树结构化为具有偏移到子单词的数组。我以前没有做过,所以我对实际发生的事情有一些疑问。 这是超基本的,对任何示例均不进行安全检查:
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);
..
因此,第一个条目的大小正在增加。到底发生了什么?我只是看了一个小例子,它似乎运行良好。数据结构中的其他条目不受影响。我最初担心的是,如果结构的大小变大了,它会碰到数组中的下一个项目,但我想那没有发生。这让我意识到我真的不知道幕后发生了什么。
DataStructure d
中的
vector<Entry>
是否必须重新分配内存?     
已邀请:
您没有使用动态分配,但是使用了向量类。内部“ 5”将其可变长度数组存储在要放入外部向量的Entry对象的外部。     
是的,a6ѭ动态地管理自己的内存。 结构的大小(实际上,任何数据类型)在编译时是固定的;它在运行时不受影响。     
std::vector
的大小是恒定的,因为它使用内部指向堆块的指针存储数据,通常它具有开始,结束和当前指针,并且没有太多其他内容,因此也很小。     
这看起来有些挑剔,但您选择的语气却把我拒之门外,我怀疑这也可能使您失望。   当您增加   向量中结构的大小? 请记住,
struct
本身的大小永远不会改变,任何结构在运行时也不会改变。 如果在程序开始时执行
sizeof(DataStructure)
,然后向后推一堆东西,然后再次执行
sizeof(DataStructure)
,则结果将完全相同。这是因为您要回推的数据不是
DataStructure
iself的一部分,而是由
DataStructure
中的内容指向的。 我在说什么指针?在
vector
中。
vector
也永远不会改变大小-但其中的项目数量会改变。
vector
管理指向您要回退的一些动态分配的东西的指针。当您推回更多内容时,托管阵列将填满。当托管数组最终满到ѭ16时,the13不得不分配一个更大的新数组,然后将您的内容复制到其中(这就是为什么包含STL的对象必须是“可复制的”)的原因。     

要回复问题请先登录注册