Освобождение выделенной памяти - PullRequest
2 голосов
/ 14 июля 2010

Это хорошая практика?Или мне просто заменить блок кода между { и } функцией?Это может быть многоразовым (я признаю), но моя единственная мотивация для этого - освободить colsum, поскольку это огромный и не требуется, чтобы я мог освободить выделенную память.

 vector<double> C;
 {
  vector<double> colsum;
  A.col_sum(colsum);
  C = At*colsum;
 }
 doSomething(C);

Ответы [ 5 ]

13 голосов
/ 14 июля 2010

Использование квадратных скобок для определения автоматических переменных прекрасно в моей книге, но, как правило, если вы обнаружите, что делаете это часто, особенно несколько раз в одной и той же функции, ваша функция, вероятно, выполняет слишком много разных задач и должна быть разбита.

5 голосов
/ 14 июля 2010

Данные для векторов всегда распределяются динамически. В стеке хранятся только бухгалтерские данные. Даже если бы это было не так, выделение стековой памяти практически бесплатно. Отмена выделения из стека - это просто изменение значения регистра в большинстве архитектур.

EDIT

Что касается динамического освобождения, его нужно будет освободить в той или иной точке (особенно в конце функции). Вы на самом деле ничего не теряете, оставляя выделенную память до тех пор, пока не захотите выделять больше, а этого недостаточно. Точное время, когда происходит такое освобождение, должно вызывать беспокойство, прежде чем вы действительно столкнетесь с какой-то проблемой?

/ EDIT

Но какой в ​​этом смысл? Похоже, вы преждевременно относитесь к оптимизации.

Если вы хотите провести рефакторинг своего кода, делайте это ради ясности, а не производительности.

3 голосов
/ 14 июля 2010

Как уже отмечалось, векторная память не выделяется в стеке.Если вы хотите освободить эту память на ранних стадиях, общая идиома:

vector<double> C;
vector<double> colsum;
A.col_sum(colsum);
C = At*colsum;
    std::vector<double>().swap(colsum);
doSomething(C);

Это создаст временный вектор и поменяет содержимое большим вектором.В конце инструкции временное устройство будет уничтожено, а память освобождена.У вас останется пустой вектор.

Обратите внимание, что colsum.resize(0) и colsum.clear() не нужно освобождать доступную память, и во многих случаях они не будут предполагать, что если вектор вырос до этогоразмер раньше, есть вероятность, что он сделает это снова.

3 голосов
/ 14 июля 2010

Vector не сохраняет память в стеке. Там хранится только сам векторный объект, который не очень большой. Определение области так, как это, вызывает разрушение, которое освобождает выделенную память.

Кроме того, я не уверен, что в ISO указано, что реализация должна извлекать переменную subscope из стека.

0 голосов
/ 15 июля 2010

Если внутренний код будет повторно использован в другом месте, разделите его на функцию.Если внутренний код вызывается часто (как в цикле), то, вероятно, его необходимо реорганизовать, чтобы вектор не создавался и не разрушался в циклеВ противном случае, я не считаю плохой практикой делать то, что вы предложили.

...