Для C ++, независимо от платформы, куча почти всегда динамически расширяется, запрашивая у ОС больше памяти по мере необходимости. На некоторых встраиваемых платформах или на некоторых очень старых платформах это может быть не так, но тогда вы, вероятно, очень хорошо представляете, сколько у вас кучи из-за характера среды.
На платформах Unix это вдвойне верно. Даже большинство встроенных платформ Unix работают таким образом.
На платформах, которые работают подобным образом, библиотека обычно не имеет каких-либо внутренних ограничений, но вместо этого полагается на ОС, чтобы сказать ей, что у нее больше не может быть памяти. Это может произойти хорошо после того, как вы фактически запросили больше памяти, чем доступно, хотя по ряду причин.
В большинстве систем Unix существует жесткое ограничение на объем памяти, который может иметь процесс. Этот лимит можно запросить с помощью системного вызова getrlimit
. Соответствующая константа - RLIMIT_AS. Этот предел определяет максимальное количество страниц памяти, которое может быть назначено процессу, и напрямую ограничивает объем доступного пространства кучи.
К сожалению, этот предел напрямую не говорит, сколько кучи вы можете использовать. Страницы памяти назначаются процессу в результате вызовов mmap, для хранения самого кода программы и для стека процесса.
Кроме того, этот предел часто устанавливается значительно превышающим общий объем памяти, доступный всей системе, если вы складываете вместе физическую память и пространство подкачки. Таким образом, в действительности вашей программе часто не хватает памяти до достижения этого предела.
Наконец, в некоторых версиях Unix страницы с чрезмерным назначением. Они позволяют вам выделять огромное количество страниц, но на самом деле находят память для этих страниц только тогда, когда вы пишете на них. Это означает, что ваша программа может быть уничтожена за нехватку памяти, даже если все вызовы выделения памяти выполнены успешно. Основанием для этого является способность выделять огромные массивы, которые будут использоваться только частично.
Итак, короче говоря, нет типичного размера, и нет хорошего способа узнать, какой на самом деле размер.