__int64 против int - Управляемая память - PullRequest
0 голосов
/ 31 июля 2009

У меня 32-битный компьютер с Win XP. Я использую язык Visual C ++ для проверки этого сценария. Я создаю вектор как vector <__ int64> v. Я делаю заметку о виртуальной памяти, скажем, ее 400 КБ сейчас. Затем я добавляю около 5 миллионов целых чисел. Сейчас я отмечаю виртуальную память, ее объем увеличился примерно до 900 КБ. Теперь я называю стирание или очистку вектора. Сейчас я проверяю виртуальную память на 600 КБ.

Я пробую тот же сценарий с вектором int v. На этот раз я получаю точное количество памяти до заполнения вектора и после очистки вектора.

Почему существует разница между памятью?

Из комментариев: Используется SmartHeap .

Ответы [ 4 ]

3 голосов
/ 31 июля 2009

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

Чтобы гарантировать освобождение памяти, убедитесь, что ваш вектор выходит из области видимости, или используйте временный вектор:

{
    std::vector<__int64> temp;
    v.swap(temp);
}
2 голосов
/ 31 июля 2009

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

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

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

0 голосов
/ 31 июля 2009

Ребята, у меня проблема здесь.

Для __int64 Если я зарезервирую несколько байтов для вектора на первом месте, а затем сделаю вставки и затем очищу вектор, я получу исходную память обратно. Однако, что озадачивает меня, почему этот подход не требуется для нормального вектора, если int.

0 голосов
/ 31 июля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...