收缩std :: vector的大小以适应其实际数据以节省内存使用量?vec.swap()在MSVC中不起作用?

JXI*_*ITC 4 c++ memory vector

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

所以我想缩小他们节省内存的能力.一种典型的方法是使用此问题中描述的vector.swap()方法:

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

我试过这段代码,但发现.swap()操作实际上并没有降低内存成本.(我查看了任务管理器中的私有工作集大小以获取进程的内存使用情况)

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

或者就像@Adam Rosenfield所说的那样,这种变化并没有将自由空间归还给OS?或者我不应该使用任务管理器来查找其内存使用情况?我希望这个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;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

之前.resize():207382之后.resize():207382之后.swap():10

Nik*_*sov 7

检查capacity()矢量.您很可能会发现向量实际上减少了它的内存使用量.您所看到的可能是malloc()实现不将内存释放回操作系统.

  • 是的,堆管理员会为您的流程进行未来分配而回收它. (2认同)