2010-04-13 4 views
1

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

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

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

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

Благодаря

+1

Для чего это платформа? – WhirlWind

+0

Благодаря архитектуре виртуальной памяти ваш компьютер будет скручен в положение эмбриона задолго до того, как вы будете использовать всю доступную память.Конечно, виртуальная память - это не плохая вещь; идея заключается в том, чтобы придать иллюзию того, что у вас намного больше оперативной памяти, чем вы на самом деле, и грамотно деградировать, так как ваша программа увеличивает потребление памяти и засасывает жизнь вашей ОС. Но не обманывайте себя мыслью, что вы можете предсказать байт (или даже МБ), сколько памяти вы можете безопасно использовать. –

+0

Я думаю, вы могли бы сказать, что деградация изящна с точки зрения * процесса *. С точки зрения пользователя, это вызывает беспокойство, когда все замедляется, как меласса, и слышится трэш жесткого диска, но я думаю, что это лучше, чем паника. –

ответ

6

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

2

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

2

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

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

2

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

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

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

1

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

MEMORYSTATUS st; 
::GlobalMemoryStatus(&st); 
1

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

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

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

Смежные вопросы