Что определяет, сколько памяти можно выделить? - PullRequest
0 голосов
/ 21 октября 2011

Это продолжение моего предыдущего вопроса о том, почему size_t необходим.

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

Что определяет, сколько вы можете выделить сразу?

Ответы [ 2 ]

3 голосов
/ 21 октября 2011

Архитектура вашей машины, операционной системы (но обе взаимосвязаны) и ваш компилятор / набор библиотек определяет, сколько памяти вы можете выделить за один раз.

malloc не нужно , чтобы иметь возможность использовать всю память, которую ОС может ему дать.ОС не требуется , чтобы сделать доступной всю память, имеющуюся на машине (и, например, различные версии Windows Server имеют различную максимальную память по причинам лицензирования )

Но учтите, что ОС может предоставлять больше памяти, чем та, что имеется в машине, и даже больше памяти, чем разрешено материнской платой (скажем, материнская плата имеет одинСлот памяти, который принимает только 1 ГБ карты памяти, Windows может позволить программе выделить 2 ГБ памяти).Это делается с помощью виртуальной памяти, подкачки (вы знаете, файл подкачки, ваш старый и медленный друг :-) Или, например, с помощью NUMA .

0 голосов
/ 21 октября 2011

Я могу представить себе три ограничения в реальном коде:

  • Самый большой неподписанный int size_t может выделить. size_t должен быть того же типа (того же размера и т. д.), который использует механизм выделения памяти ОС.
  • Самый большой блок, который операционная система может обрабатывать в оперативной памяти (как представлен размер блока? Как это представление влияет на максимальный размер блока?).
  • Фрагментация памяти (самый большой свободный блок) и общий объем доступной свободной оперативной памяти.
...