C ++ Резервное пространство памяти - PullRequest
2 голосов
/ 22 марта 2010

Есть ли способ зарезервировать пространство памяти, которое будет использоваться по умолчанию позднее Windows Manager, чтобы моему приложению не хватало памяти, если моя программа не использует пространство больше, чем я зарезервировал при запуске моей программы?

Ответы [ 5 ]

2 голосов
/ 22 марта 2010

Нет смысла делать подобные вещи, когда у вас есть виртуальная память.

0 голосов
/ 22 марта 2010

Хотя обычно это очень плохая идея (как уже отмечали другие), да, Windows разрешает это.Посмотрите VirtualLock , если вы действительно настаиваете.По крайней мере, в 99% случаев это неправильно, но всегда возможно (хотя и крайне маловероятно), что то, что вы делаете, приходится на долю процента, оправдывающего это.

0 голосов
/ 22 марта 2010

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

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

Все, что вам действительно нужно выделить, это части адресного пространства вашего процесса. Части этого могут быть сопоставлены с файлами (такими как ваш EXE или любые собственные библиотеки DLL, которые не нужно перебазировать). Другие части могут быть «распределением памяти», но на самом деле это просто означает, что они сопоставлены с местами в файле подкачки.

Ничто из этого не является "действительно" памятью в каком-либо надежном смысле.

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

0 голосов
/ 22 марта 2010

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

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

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

0 голосов
/ 22 марта 2010

Неявно. Невозможно указать диспетчеру памяти C (тот, который дает вам память при вызове malloc или new), чтобы зарезервировать пространство.

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


Редактировать -
В Windows вы можете использовать VirtualAllocEx и VirtualFreeEx, чтобы попросить Windows зарезервировать для вас страницы памяти. Но нет никакого способа сказать malloc и new использовать эту память. Если вы решите пойти по этому пути, вам нужно будет реализовать собственный менеджер памяти.

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