矢量重新分配,而不考虑储备
Vector reallocation regardless of reserve
假设我有一个std::vector<Group> groups
。我要push_back
很多Group
groups
.这就是为什么我reserve
.我的问题是,当我保留groups
时,成员v
未初始化。但在push_back
期间,Group b
和Group c
有不同的v
大小。那么我们能不能说,即使reserve
打电话,当我push_back
时,重新分配是不可避免的?
struct Group
{
std::vector<int> v;
};
int main()
{
std::vector<Group> groups;
groups.reserve(1e6);
Group b, c;
b.v.resize(1000);
c.v.resize(2000);
groups.push_back(b);
groups.push_back(c);
return 0;
}
这里的关键是了解C++对象大小的工作原理。
在您的示例中:
struct Group
{
std::vector<int> v;
};
类型Group
的对象在内存中具有恒定大小。这绝对是至关重要的。编译器需要预先知道Group
的大小。这就是为什么sizeof(Group)
是一个编译时常量。
现在..隐藏在vector
里面是一个指针。同样,它是固定大小(4 或 8 个字节,具体取决于位数(。因此,您的vector
也具有恒定的大小。此指针指向在堆上动态分配的内存块。这是存储元素的位置。同样,此块的大小是固定的,但可以重新分配,因此当矢量填满时,指针最终可能会指向一个新的更大的内存块。这些操作都不会使对象本身vector
或Group
对象本身变大。
当vector
填满并变得"更大"时,vector
对象本身的内存占用量保持不变。但是,该内部指针指向的内存(堆上其他地方的内存(将根据需要增长。
因此,当您调用reserve
时,vector
会预先确切地知道要保留多少动态内存。当您添加它们时,这不会受到Group
内矢量中的许多元素的影响。从reserve
调用的角度来看,元素大小在编译时是固定的。
相关文章:
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 不考虑模板构造函数
- 为什么通过指针编译时不能分配 const 初始化
- C++ - 使用基于范围的 for 循环将字符值分配给向量中的字符串不会分配值
- 为什么子项目 CMAKE 不考虑 fno-sanitize,请禁用目标的消毒器
- 如何对向量进行排序<浮点数,字符串>而不考虑字符串
- 重用字符串流而不重新分配
- 编译器是否会创建vtable,而不考虑在c++中创建对象
- CFileFind不考虑目录的第一个文件
- 初始化值是否保证通过其自己的地址反映,而不考虑内存顺序
- Linux getrusage()maxrss最大驻留集大小不随分配而增加(C++)
- 矢量重新分配,而不考虑储备
- GlobalMemoryStatusEx 不考虑新阵列
- 如何创建一个程序来标识最长的子字符串回文,而不考虑字母大小写
- OpenGL不考虑GL_DIFFUSE位置光的距离
- Eclipse 问题 - 编译期间不考虑 .c 和 .cpp 文件中定义的预处理
- 如果容器不重新分配,STL 的priority_queue会重新分配吗?
- std::unordered_set 是否对任何对象进行摊销常量查找时间,而不考虑谓词
- OpenSSL:当输出ptr为空时,BIGNUM的bin2bn不会分配新的BIGNUM
- 不能分配 X 类型的对象,因为它的复制运算符隐式删除