【发布时间】:2021-04-23 16:25:06
【问题描述】:
const size_t size = 10000000;
using T = unsigned short[];
vector<unique_ptr<T>> v;
v.resize(size);
for (size_t n = 0; n != size ; ++n) {
v[n] = make_unique<T>(3);
for (int i = 0; i!= 3; ++i)
v[n][i] = rand();
}
我想测量它使用了多少内存。
- 我的期望: 10.000.000*(8+2*3) = 140.000.000 字节。每个指针 8 个字节,每个无符号短字节 2 个字节。
- “valgrind -- --tool=memcheck”返回的内容: 总堆使用量:10,000,112 次分配,10,000,111 次释放,140,161,828 字节分配
- 实际情况: VIRT = 419044,RES = 394180 (KB)。
为什么实际尺寸是 valgrind 显示的 3 倍? 我在 VSL、ubuntu 上运行它。
【问题讨论】:
-
前导:(1) 指针需要在某处注册大小,因为 T 的边界未知,因此增加了 161,828 个字节; (2) 虽然程序需要一定的内存,但操作系统会为您的进程保留整个页面。
-
@YSC 另外,我应该添加 resize() 而不调用 make_unique
具有预期的行为。 IE。 10M 个具有所需(8 字节)大小的默认元素。我从未见过页面占用如此多的内存。这整个问题很奇怪。 -
您的指针向量是连续的,但指向的实际数据(那些短裤)可能分散在虚拟内存中。
标签: c++ memory valgrind allocation