实际上我的程序中有数百万个 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/