我怎么知道std :: vector的分配记忆大小
How can I know the allocated memory size of a std::vector?
我知道我们可以使用size()
函数来获得向量大小,例如:
std::vector<in> abc;
abc.resize(3);
abc.size();
我的问题是我怎么知道向量的内存大小?举一个例子:
std::vector<int> abc;
abc.reserve(7);
//the size of memory that has been allocated for abc
您使用成员函数capacity()
获得分配的容量
std::vector<int> abc;
abc.reserve(7);
std::cout << abc.capacity() << std::endl;
要通过字节分配内存,您可以做:
sizeof(int) * abc.capacity();
这是给出的,您知道您的value_type
是int
。如果您不
sizeof(decltype(abc.back())) * abc.capacity();
真正的答案是您不能。其他人建议通常会起作用的方法,但是您不能以任何分配的实际内存来反映capacity
。
一方面,堆通常会分配比要求更多的内存。这与针对分裂等的优化有关... vector
无法知道实际分配了多少内存,只有它要求的内容。
所以capacity
充其量会给您一个非常粗略的估计。
使用capacity
成员函数-http://en.cppreference.com/w/cpp/container/container/vector/capacity
连续的内存上有很强的语句,因此大小为
sizeof( abc[0] ) * abc.capacity();
或
( (char*)(&abc[1]) - (char*)(&abc[0] ) ) * abc.capacity();
因为std :: vector可以存储复杂的对象(例如std :: string),它们具有内部内存管理并可能分配其他内存,确定总内存使用情况可能很难。
对于包含简单对象的向量,例如 int ,建议使用 apcation 和 sizeof 的建议解决方案可行。
<</p>相关文章:
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 获取字符串的长度并将其分配给数组
- 将地址分配给本地指针后,公共对象的变量将消失
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 我在二维向量中是否正确分配了内存
- 正在尝试重载二进制搜索树分配运算符
- 为什么分配堆内存比分配堆栈记忆更快
- 当记忆分配给课堂时
- 如何为标准功能分配空间并做记忆
- 如何在函数中分配的自由记忆
- 我怎么知道std :: vector的分配记忆大小
- 参考记忆分配技术
- C++的记忆分配困境