C++ 收缩标准::向量';大小是否适合其实际数据以节省内存使用?vec.swap()不';你不在MSVC工作吗?

C++ 收缩标准::向量';大小是否适合其实际数据以节省内存使用?vec.swap()不';你不在MSVC工作吗?,c++,memory,vector,C++,Memory,Vector,实际上,我的程序中有数百万个向量对象。默认情况下,系统将为每个向量分配比实际需要更多的空间,因为这些向量在完成加载后是只读的 所以我想缩小它们的容量以节省内存。典型的方法是使用vector.swap()方法,如中所述: 输出为: Before.resize():207382 After.resize():207382 在.swap()之后:10 检查向量的大小。您很可能会发现向量实际上减少了内存使用。您看到的可能是malloc()实现没有将内存释放回操作系统。我没有看过实现,但是vector的复

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

所以我想缩小它们的容量以节省内存。典型的方法是使用vector.swap()方法,如中所述:

输出为:

Before.resize():207382 After.resize():207382 在.swap()之后:10


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

我没有看过实现,但是
vector
的复制构造函数也可能复制容量

使用迭代器形式构造新的临时文件:

vector<int> tmp(vec.begin(), vec.end());
vec.swap(tmp);
向量tmp(vec.begin(),vec.end()); 向量互换(tmp);
C++11提供了
std::vector::shrink_to_fit
,您可能想试试。此函数要求缩小向量的容量,以适合其所保存数据的大小但是,实现没有绑定到此请求,因此您必须检查它的行为

如果您想避免“阻塞”预订,您必须研究标准库的专门实现;例如,用于游戏开发的工具可能提供您需要的功能


重要的是要记住,当您使用
new
请求内存时,操作系统通常会提供比您请求的内存更多的内存。这可能会对您看到的内容产生一些影响。

您是否正在使用Visual Studio 2010?如果是这样的话,它就支持C++0x的向量新方法,
收缩到合适的位置。请参阅。

工作集计数器仅考虑提交的虚拟地址空间。它不考虑地址空间的单个用户如何使用它

一个信息量稍大的测试是多次运行
vecMemoryTest()
,并跟踪工作集。如果在第一次运行后它没有上升,您就知道您正在正确地释放内存。如果它真的上升,它可能意味着什么


一个更好的测试是修改
vecMemoryTest()
再次分配一个同样大小的巨大
向量,然后销毁它。如果工作集(大部分)保持不变,您就知道您正确地收缩了原始
向量

,即使内存被正确释放,运行库也不必将虚拟地址空间返回操作系统。交换技巧可以在一行中,不是吗<代码>向量交换(向量(向量))您如何尝试测量已用容量。看起来它应该可以正常工作。通常的单行程序习惯用法是
std::vector(v).swap(v)。一个相关的问题保证可以工作,但如果他必须为“数百万个向量”这样做,可能会非常慢。有没有办法强迫进程释放这部分内存?谢谢你提醒我在示例代码中添加了一些调试信息,请检查我问题中的更新:可能有一些特定于microsoft的api强制libc修剪堆,但您真的需要它吗?为什么?即使这些内存没有被释放到操作系统中,这些部分的内存将来也会被重新分配到进程的其他部分-这是正确的吗?如果是这样的话,那么我实际上并不介意。是的,它由堆管理器回收,供您的进程将来分配。
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;
}
vector<int> tmp(vec.begin(), vec.end());
vec.swap(tmp);