2011-10-21 9 views
0

Это вопрос о том, почему size_t необходим для my previous question.Что определяет объем памяти?

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

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

+0

Посмотрите на исправление, которое я сделал по вашему вопросу – xanatos

+1

ОС. это лишь некоторые дополнительные символы, потому что комментарий был недостаточно длинным. –

+0

@xanatos Значит, size_t может быть больше, чем нужно для этого? –

ответ

3

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

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

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

+0

Фрагментация памяти также может влиять на это значение. – xappymah

+0

@xappymah Гораздо сложнее ... Фрагментация пространства пространства (в защищенном режиме) обычно влияет гораздо раньше, чем фрагментация реальной памяти. На Win 32 с 3 ГБ оперативной памяти невозможно выделить один блок из 2 гб, и довольно часто сложно даже выделить один блок из 5-700 мб (я знаю это, потому что я пытался mmap iso из CD) – xanatos

0

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

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

«Фрагментация памяти (самый большой свободный блок)» в защищенном режиме - это самый большой размер виртуального адресного пространства. – xanatos

Смежные вопросы