c++ - 收缩 std::vector 's size to fit its actual data to save memory usage? vec.swap() doesn' t 在 MSVC 中工作吗?

标签 c++ memory vector

实际上我的程序中有数百万个 vector 对象。默认情况下,对于每个 vector ,系统将分配比实际需要更多的空间,因为这些 vector 在完成加载后是只读的。

所以我想缩小自己的容量来节省内存。一种典型的方法是使用 vector.swap() 方法,如 this question 中所述:

 std::vector<T> tmp(v);    // copy elements into a temporary vector
           v.swap(tmp);              // swap internal vector data

我试过这段代码,但发现 .swap() 操作实际上并没有减少内存成本。 (我查看了任务管理器中的Private Working Set size来获取进程的内存使用情况)

这是为什么? 更新" 我使用的是 VS 2008,我添加了一些行来在运行时输出当前容量。如以下代码及其输出所示,交换后 vec.capacity 确实缩小到 10,但这并未反射(reflect)在任务管理器中。

或者就像@Adam Rosenfield 所说的那样,此更改没有将释放的空间返回给操作系统?或者我不应该使用任务管理器来查看它的内存使用情况?我希望这个 swap() 操作可以像 delete pointer_to_a_big_vec 一样直接释放内存。

我的测试样本在这里:

void vecMemoryTest()
{
  vector<int> vec;

  //make it big!
  for(int i = 0; i <= 100000; i++){vec.push_back(i);}
  for(int i = 0; i <= 100000; i++){vec.push_back(i);}

  cout << "Before .resize() : " << vec.capacity() << endl;

  //OK now I only need the first 10 elements
  vec.resize(10);   

  cout << "After .resize() : " << vec.capacity() << endl;

  //So try to free other spaces
  vector<int> tmp(vec.begin(), vec.end());



  vec.swap(tmp);    // now should free wasted capacity
            // But in fact it doesn't

  cout << "After .swap() : " << vec.capacity() << endl;
}

输出是:

Before .resize() : 207382 After .resize() : 207382 After .swap() : 10

最佳答案

检查 capacity()的 vector 。您很可能会发现该 vector 实际上减少了它的内存使用量。您看到的可能是 malloc() 实现没有将内存释放回操作系统。

关于c++ - 收缩 std::vector 's size to fit its actual data to save memory usage? vec.swap() doesn' t 在 MSVC 中工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9420289/

相关文章:

c - 如何检测内存泄漏?

c++ - 如何使用 header 对象在 malloc 内存中安全地构造 C++ 对象

c++ - 重载 << 运算符以插入到 vector 中

c++ - std::remove 和 std::remove_if 设计的稳定性是否失败?

c++ - 与 C++ 模板的预处理器式连接?

c++ - (2 个问题) 'class' 类型重定义(即使使用#pragma once),以及静态函数内部的静态成员对象初始化?

list - 如何使用 chez 方案获得给定列表中所有元素 >10 的总和?

c++ - 回溯:8 象占据整个棋盘

c - 在 C 语言的 ARMv7 中预取

c++ - vector 在返回时会被复制吗?