Что определяет, сколько памяти можно выделить?
Это продолжение моего предыдущего вопроса о том, почему size_t необходим.
Учитывая, что size_t гарантированно будет достаточно большим, чтобы представлять наибольший размер блока памяти, который вы можете выделить (это означает, что некоторые целые числа могут быть больше, чем size_t), мой вопрос...
Что определяет, сколько вы можете выделить сразу?
2 ответа
Архитектура вашей машины, операционной системы (но обе взаимосвязаны) и ваш компилятор / набор библиотек определяют, сколько памяти вы можете выделить за один раз.
malloc
не должен быть в состоянии использовать всю память, которую операционная система могла дать ему. Операционная система не должна делать доступной всю память, имеющуюся в машине (и различные версии Windows Server, например, имеют различную максимальную память по причинам лицензирования)
Но обратите внимание, что ОС может сделать доступным больше памяти, чем та, что имеется в машине, и даже больше памяти, чем разрешено материнской платой (скажем, у материнской платы есть один слот памяти, который принимает только 1 ГБ карты памяти, Windows все еще может позволить программа выделяет 2 ГБ памяти). Это делается с помощью виртуальной памяти, пейджинга (вы знаете, файл подкачки, ваш старый и медленный друг:-) или, например, с помощью NUMA.
Я могу думать о трех ограничениях в реальном коде:
- Самый большой неподписанный int size_t может выделить. size_t должен быть того же типа (того же размера и т. д.), который использует механизм выделения памяти ОС.
- Самый большой блок, который операционная система может обрабатывать в оперативной памяти (как представлен размер блока? Как это представление влияет на максимальный размер блока?).
- Фрагментация памяти (самый большой свободный блок) и общий объем свободной оперативной памяти.