Возвращение размера доступной виртуальной памяти во время выполнения в C ++ - PullRequest
1 голос
/ 13 апреля 2010

В C ++ есть предопределенная библиотечная функция, которая будет возвращать размер оперативной памяти, доступной в настоящее время на компьютере, на котором выполняется программа, во время выполнения?

Например, если размер объекта составляет 4 байта, то можно ли разделить доступную виртуальную память на 4 байта, чтобы получить оценку того, сколько еще объектов может быть безопасно сохранено программой?

Я использовал функцию sizeof (), чтобы вернуть размер объектов в моей программе.

Видя, что об этом часто спрашивают в полезных ответах - Платформа, на которой работает программа, - Windows (7).

Спасибо

Ответы [ 6 ]

6 голосов
/ 13 апреля 2010

Нет в стандартной библиотеке C ++ - ваша операционная система, вероятно, предоставляет эту возможность через API для конкретной платформы.

2 голосов
/ 13 апреля 2010

Это зависит от платформы, а не является частью языкового стандарта.

Однако для получения информации о памяти процесса есть специальный API для Windows: GetProcessMemoryInfo () .

Кроме того, виртуальная адресация позволяет процессам распределять больше, чем общий объем физической памяти.

2 голосов
/ 13 апреля 2010

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

Нет встроенных функций C ++, для этого вы должны использовать OS API для его получения. Например, в Windows вы можете использовать Win32 API для получения этой информации.

2 голосов
/ 13 апреля 2010

В стандарте C ++ нет ничего, что возвращало бы объем свободной памяти. Такая функция, если она вообще доступна, будет зависеть от платформы.

1 голос
/ 13 апреля 2010

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

Кроме того, программе почти никогда не хватает свободного места в виртуальной памяти. Сначала у него заканчивается свободный непрерывный кусок пространства, достаточно большой, чтобы соответствовать запросу. Сумма размеров блоков, которые вы получаете от HeapWalk, не имеет смысла, если только вы никогда не делаете очень маленькие выделения.

Наиболее типичная причина, по которой вам нужна такая функция, заключается в том, что вашей программе постоянно не хватает памяти. Существует очень эффективное и дешевое решение для этой проблемы. Двести баксов купит вам 64-битную версию Windows.

1 голос
/ 13 апреля 2010

В Win32 вы можете использовать

 MEMORYSTATUS st;
 ::GlobalMemoryStatus(&st);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...