调整保留std::vector大小时的c++内存分配
C++ memory allocation upon resizing of reserved std::vector
我对std::vector行为很好奇,我在任何地方都找不到答案,所以…
让我们有一个奇数程序:
std::vector<int> vec;
vec.reserve(5);
for(int i = 0; i < vec.size(); ++i) // OK, I have noticed the mistake in the condition, I am leaving it here for educational purposes
{
vec.resize(vec.size() + 1);
vec[i] = 42;
}
内存分配方面的行为是什么?只按预期分配一次内存,还是调整大小清除不需要的内存?
对于初学者,这个循环将永远不会执行
std::vector<int> vec;
vec.reserve(5);
for(int i = 0; i < vec.size(); ++i)
{
vec.resize(vec.size() + 1);
vec[i] = 42;
}
因为初始向量的大小等于0
也许你的意思是像下面这样
std::vector<int> vec;
vec.reserve(5);
for(int i = 0; i < vec.capacity(); ++i)
{
vec.resize(vec.size() + 1);
vec[i] = 42;
}
在这种情况下,vector将不会被重新分配:)
下面是一个示范程序
#include <iostream>
#include <vector>
int main()
{
const size_t N = 5;
std::vector<int> v;
v.reserve( N );
std::vector<int>::size_type i = 0;
do
{
v.resize( v.size() + 1);
std::cout << v.capacity() << 't' << v.data() << std::endl;
} while ( ++i < v.capacity() );
return 0;
}
它的输出可能看起来像
5 0x824da10
5 0x824da10
5 0x824da10
5 0x824da10
5 0x824da10
reserve
方法实际做的是:
请求向量容量至少足以包含
n
元素。
如果
n
大于当前向量容量,则该函数使容器重新分配其存储空间,使其容量增加到n
(或更大)。在所有其他情况下,函数调用不会导致重新分配,并且向量容量不受影响。
此函数对向量大小没有影响,也不能改变其元素。
因此,首先,vec.reserve(5);
将为5
元素分配内存。(但是向量的大小仍然是0
)
然后,在循环内部,你调用vec.resize(vec.size() + 1);
,让我们首先看看,这个函数做什么:
resize
实际做的是:
调整容器的大小,使其包含n个元素。
如果
n
小于当前容器大小,则内容将减少到其第一个n
元素,并删除超出的元素(并销毁它们)。如果
n
大于当前容器的大小,则根据需要在末尾插入元素来扩展内容,以达到n
的大小。如果指定了val
,则将新元素初始化为val
的副本,否则将它们进行值初始化。如果
n
也大于当前容器容量,则自动重新分配已分配的存储空间。注意,这个函数通过插入或删除元素来改变容器的实际内容。
在你的例子中,程序,In循环总是传递n
,它比vec
的 capacity
低,所以,不会执行内存分配,只有 size
属性会被改变。
reserve
分配空间来容纳请求的项数。resize
告诉vector容器中当前有多少项。
因此,如果您保留较少,那么您将使用resize
指定分配。
vec.size()
一开始就是0。vec.reserve(5)
将为至少5个元素分配空间。这样循环就什么也不做了。
但是让我们假设你想循环到5。只有reserve调用才会为vector分配更多内存。循环内的resize操作,由于小于或等于vector容器的容量,只会在已经分配的空间中构造新元素。
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 类型总是使用其大小存储在内存中吗
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存