【问题标题】:What happens when you increase the size of a struct in a vector?当您增加向量中结构的大小时会发生什么?
【发布时间】:2011-04-15 19:43:44
【问题描述】:

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

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

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&lt;Entry&gt; 是否需要重新分配内存?

【问题讨论】:

  • “结构的大小变大了,它会碰到数组中的下一项”...什么数组?你有一个向量对象,而不是一个数组。

标签: c++ vector struct offset


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 好吧,这是有道理的。我在想一个向量存储在连续的内存中,除了存储整数的简单示例之外,我不确定它是如何工作的。
    • 向量确实将其数组存储在连续内存中——向量对象所指向的内存。您可以通过将指向向量元素的指针传递给期望数组的函数来在代码中利用此保证。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      当你增加 向量中结构的大小?

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

      如果你在程序开始的时候做sizeof(DataStructure),然后把一堆东西推回去再做sizeof(DataStructure),结果会完全一样。这是因为您推回的数据不是DataStructure 自身的部分,而是由DataStructure 中的某些内容指向

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

      【讨论】:

      • 我很高兴你提出了这一点,因为我只是假设结构确实改变了大小。我实际上并没有做过sizeof(DataStructure) 来检查。我想如果你真的想知道任何时候的大小,你将不得不遍历 DataStructure 中的每个元素并将其所有数据成员的 sizeof() 相加?
      猜你喜欢
      • 2018-08-03
      • 1970-01-01
      • 2016-06-14
      • 2019-03-30
      • 2019-08-18
      • 1970-01-01
      • 2020-11-13
      • 2016-01-26
      • 1970-01-01
      相关资源
      最近更新 更多