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

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

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

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

2 ответа

Решение

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

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

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

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

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