На самом деле в моей программе миллионы векторных объектов. По умолчанию для каждого вектора система назначит больше места, чем фактически необходимо, поскольку эти векторы доступны только для чтения после завершения загрузки.
Так что я хочу уменьшить их возможности для экономии памяти. типичным способом является использование метода vector.swap (), как описано в этот вопрос :
std::vector<T> tmp(v); // copy elements into a temporary vector
v.swap(tmp); // swap internal vector data
Я пробовал этот код, но обнаружил, что операция .swap()
на самом деле не снижает стоимость памяти. (Я посмотрел на Размер частного рабочего набора в диспетчере задач , чтобы получить использование памяти процессом)
Почему это так?
UPDATE "
Я использую VS 2008, и я добавил несколько строк для вывода текущей емкости во время выполнения. Как видно из приведенного ниже кода и его результатов, vec.capacity сократился до 10 после перестановки, но это не отражается в диспетчере задач.
Или, может быть, как сказал @ Адам Розенфилд, это изменение не вернуло освободившееся пространство для ОС? Или я не должен использовать диспетчер задач, чтобы посмотреть его использование памяти? Я надеюсь, что эта операция 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;
}
и вывод:
До .resize (): 207382
После .resize (): 207382
После .swap (): 10