在vector中增加struct的大小会发生什么?
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);
..
所以第一个条目的大小在增加。到底发生了什么?我只是浏览了一个小例子,它似乎工作得很好。数据结构中的其他条目不受影响。我最初担心的是,如果结构的大小变大,它可能会遇到数组中的下一个项目,但我想这不会发生。这让我意识到,我真的不知道幕后发生了什么。DataStructure d
中的vector<Entry>
必须重新分配内存吗?
是,std::vector
动态管理它自己的内存。
结构体(实际上,任何数据类型)的大小在编译时是固定的;
您没有使用动态分配,但是vector类使用动态分配。
vector<int>
将它的变长数组存储在外部的Entry对象中。 std::vector
的大小是恒定的,因为它使用内部堆块指针来存储数据,通常它有一个开始,结束和当前指针,没有太多其他的,使得它非常小。
这可能看起来很挑剔,但你选择的措辞让我感到困惑,我怀疑它可能也会让你感到困惑……
当你增加在一个向量结构体的大小?
请记住,struct
本身的大小永远不会改变,任何结构体也不能在运行时改变大小。
如果您在程序开始时执行sizeof(DataStructure)
,然后将一堆东西推回去并再次执行sizeof(DataStructure)
,结果将完全相同。这是因为您推回的数据不是DataStructure
本身的部分,而是由DataStructure
中的某些内容指向。
我说的指针在哪里?在vector
。vector
也永远不会改变大小——但其中的项目数量会改变。vector
管理一个指针到一些动态分配的数组的东西,你推回。当您推回更多的东西时,托管数组就会被填满。当托管数组最终满capacity()
时,vector
必须分配一个新的,更大的数组并将您的内容复制到其中(这就是为什么stl包含的对象必须是"可复制的")。
- 这个带有模板<类 Vector 的C++代码片段有什么问题>
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 当我从 std::vector 中的新放置调用析构函数时会发生什么?
- 向后迭代 std::array 或 std::vector 的正确方法是什么?
- 这句话是什么意思 - " vector<long long> distance(n, std::numeric_limits<long long>::max()); "?
- 最接近"std::atomic<std::vector>"是什么?
- 行 - " vector<int> used(adj.size(), 0); "是什么意思?
- 将vector<vector<double>>从x86平台中创建的一个进程发送到x64中构建的另一个进程的最快方法是什么
- 使输出流式处理运算符适用于 boost::variant<std::vector<int>、int、double 的正确方法是什么>
- 代码中的"vector<<int>vector>&index"是什么意思?
- 释放 std::vector 中指针内存的最有效方法是什么?
- 当我们push_back元素时,std::vector 什么时候会放大自己?
- 如果我将"reference to vector"分配给"vector"会发生什么情况
- vector.back()和vector.end()有什么区别
- 这个(const vector<vector<int> > &A)"代码段是什么意思?
- 什么是vector<int,int>它甚至有效吗?
- std::shared_ptr<std::vector有什么问题<double>>
- 带有 std::vector 和 std::queue 的 Prim's 算法,我的代码有什么问题?
- std::vector<int> 和 std::vector* 有什么区别<int>?