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

C++ 当增加向量中结构的大小时会发生什么?,c++,vector,struct,offset,C++,Vector,Struct,Offset,我正在研究的一个问题涉及一个大的树结构。最初,我是通过newing新节点并将它们附加到其父节点等方式创建树的。这花了很长时间。一位朋友建议我放弃动态内存分配,将树构造成一个数组,并偏移到子单词。我以前没有这样做过,所以我对实际发生的事情有一些疑问 这里是超基本的,没有任何安全检查的例子: struct DataStructure { std::vector<Entry> mCollection; }; struct Entry { char mValue;

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

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

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.
};

因此,第一个条目的大小正在增加。到底发生了什么?我只是浏览了一个小例子,它似乎工作得很好。数据结构中的其他条目不受影响。我最初担心的是,如果结构的大小变大,它可能会运行到数组中的下一项中,但我认为这不会发生。这让我意识到我真的不知道幕后发生了什么。
数据结构d中的
向量
是否必须重新分配内存?

您没有使用动态分配,但向量类是。内部
向量
将其可变长度数组存储在外部向量中输入对象的外部。

您没有使用动态分配,但向量类是。内部
向量
将其可变长度数组存储在外部向量中输入对象的外部。

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


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

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


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

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

std::vector的大小是恒定的,因为它使用指针在内部堆块来存储数据,通常它有一个开始、结束和当前指针,而没有太多其他的指针,因此它也非常小

这似乎有点吹毛求疵,但你对措辞的选择让我很反感,我怀疑这也会让你很反感

当你增加压力时会发生什么 向量中结构的大小

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

如果在程序开始时执行
sizeof(DataStructure)
,然后将一堆内容推回去,再次执行
sizeof(DataStructure)
,结果将完全相同。这是因为您要推回的数据不是
DataStructure
iself的一部分,而是由
DataStructure
中的某些内容指向的


我说的指针在哪里?在
向量中
vector
也不会改变大小——但其中的项目数会改变
vector
管理一个指向动态分配的数组的指针,这些数组是您要推回的。当您推回更多内容时,托管阵列将填满。当托管数组的容量最终达到
时,
向量必须分配一个新的、更大的数组,并将您的内容复制到该数组中(这就是为什么STL包含的对象必须是“可复制的”)。

这可能看起来很挑剔,但您对措辞的选择让我很反感,我怀疑这可能也让您很反感

当你增加压力时会发生什么 向量中结构的大小

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

如果在程序开始时执行
sizeof(DataStructure)
,然后将一堆内容推回去,再次执行
sizeof(DataStructure)
,结果将完全相同。这是因为您要推回的数据不是
DataStructure
iself的一部分,而是由
DataStructure
中的某些内容指向的


我说的指针在哪里?在
向量中
vector
也不会改变大小——但其中的项目数会改变
vector
管理一个指向动态分配的数组的指针,这些数组是您要推回的。当您推回更多内容时,托管阵列将填满。当托管数组最终达到
容量()
时,
向量必须分配一个新的、更大的数组,并将您的内容复制到其中(这就是为什么STL包含的对象必须是“可复制的”)。

“结构的大小变大,它将运行到数组中的下一项中”。。。什么阵列?你有一个向量对象,而不是数组。“结构的大小变大,它将运行到数组中的下一项”。。。什么阵列?你有一个向量对象,不是数组。好的,是的,这很有意义。我认为向量存储在连续内存中,除了存储int这个简单的例子之外,我不确定这是如何工作的。向量确实将其数组存储在连续内存中,这是由向量对象指向的。您可以在代码中通过将指向向量元素的指针传递给需要数组的函数来利用这种保证。我认为向量存储在连续内存中,除了存储int这个简单的例子之外,我不确定这是如何工作的。向量确实将其数组存储在连续内存中,这是由向量对象指向的。你可以在代码中通过将指向向量元素的指针传递给需要数组的函数来利用这种保证。我很高兴你提到这一点,因为我只是假设结构确实改变了大小。我实际上并没有做一个
sizeof(DataStructure)
来检查。我是
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);
..