Как я могу выделить 2 гигабайта куска памяти в C ++? - PullRequest
2 голосов
/ 15 июля 2010

Память, которую я пытаюсь выделить, не огромна или что-то в этом роде.я просто не могу выделить от 1,5 до 1,7 гигабайт заразной памяти.Насколько я знаю, Windows дает вам 2 гигабайта виртуального пространства для использования в вашем приложении.таким образом, вызов типа malloc (1500 *1024* 1024) не является абсолютно безумным.я пробовал malloc, new [], VirtualAlloc все не работало.

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

, если я выделяю 1,5 гигабайтана машине с 256 мегабайтами оперативной памяти, и я пытаюсь получить доступ, разве система не работает, но работает?

Ответы [ 4 ]

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

Различные версии Windows имеют различные ограничения памяти .Если вы используете 32-разрядную версию, вам может понадобиться использовать методы настройки *1003* 4 ГБ для выделения более 2 ГБ.

2 голосов
/ 15 июля 2010
1 голос
/ 15 июля 2010

Если вы используете 32-битную версию Windows, у вас есть максимум 2 ГБ виртуального пространства. Ваши скомпилированные программы и библиотеки времени выполнения C / C ++ расходуют некоторую часть этого вместе с предварительно выделенным кодом и сегментами данных. Если вы используете 32-битные окна, у вас меньше памяти, чем вы думаете. Я согласен, что 1,5 Гбайт не звучит неразумно, но тогда вы подумаете, что продукты MS тоже не лишены смысла, верно?

Попробуйте кусочки Самлера в качестве проверки здравомыслия (например, 1 Гб); Я подозреваю, что это удастся. И попробуйте большие выделения в 64-битной системе, где нет практического верхнего предела.

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

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

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