Ограниченный размер размещения C ++ - PullRequest
3 голосов
/ 10 декабря 2011

Я использую Visual Studio 2008. Я динамически объявил переменную big_massive:

unsigned int *big_massive = new unsigned int[1073741824]

Но, когда я попытался отладить эту программу, я получил следующую ошибку: Неверный размер выделения: 4294967295 байт. Надеюсь, есть какой-нибудь путь, чтобы избежать такой ошибки? Спасибо!

Ответы [ 3 ]

6 голосов
/ 10 декабря 2011

Такое распределение просто невозможно в 32-битных системах x86 с sizeof(int)==4 (вы запрашиваете 4 ГБ).Общее адресное пространство процесса ограничено 4 ГБ, а сам процесс обычно ограничен менее чем этим (2 ГБ или 3 ГБ для 32-битной Windows в зависимости от настроек boot.ini и редакции Windows, не уверен, какое ограничение применяется для 32-битных процессов в 64-битной Windows, но 4 ГБ просто невозможны).

Для 64-битного случая вам потребуется 4 ГБ виртуальной памяти, доступной для поддержки этого выделения, для успешного выполнения.

3 голосов
/ 10 декабря 2011

Количество виртуальной памяти на процесс в 32-битной системе Windows или 64-битной системе Windows, на которой запущена 32-битная программа (WoW64): 2147483648 Объем памяти, необходимый для хранения массива 1073741824 4-байтовых целых чисел без знака: 4294967296 Возможно, не помещается в объеме доступной памяти, поэтому это неправильное распределение.

2 голосов
/ 10 декабря 2011
  • 32-разрядная система не может получить доступ к более чем 4 ГБ памяти на процесс.Однако выделение 3 ГБ памяти хорошо для ОС, поддерживающей ленивое распределение и чрезмерную загрузку, даже если вы используете только первые 10 КБ, а максимальный объем подкачки + память в любом случае составляет 1 ГБ.Но имейте в виду, что полагаться на это в первую очередь глупо.
  • Прежде чем пытаться использовать столько памяти, проверьте, не можете ли вы представить свои данные в более компактной форме.Если в вашем массиве есть дыры, или значения повторяются, или вы не используете полный 32-битный диапазон вашего int, или вам не нужны эти значения для определенного порядка, просто не используйте массив.
  • Помните, ОЗУ для временных данных.Если ваши данные должны быть записаны на диск, почему бы вам не использовать место на диске в первую очередь.Вы можете даже использовать отображенные в памяти файлы (вы выбираете часть своего файла и можете обращаться к ней как к памяти).Вам также могут понравиться (проще или нет) альтернативы систем управления базами данных.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...