Когда память выделяется, как я понимаю, она выделяется в куче,
который просто 16 МБ. Как делать такие программы, как видеоигры или современные
браузеры могут использовать более 1 ГБ?
Куча может расти. Это не ограничено никаким значением и конечно не 16 МБ. Вы можете легко выделить 1 ГБ кучи, просто сделайте тест программы, и вы увидите.
Поскольку очевидно, что можно использовать столько памяти, почему
это не может быть выделено в начале? Я нашел максимум, что могу
выделить на языке сборки высокого уровня составляет около 100 МБ. Это
намного больше, чем 16 МБ, и гораздо меньше, чем у меня 3, так где же это
откуда берутся ограничения?
Я не уверен, почему ваша ОС не выполняет большие запросы на размещение. Возможно, из-за фрагментации памяти? Это будет проблема, специфичная для вашей установки, которой вы не поделились. Я могу выделить гораздо больше памяти, чем без проблем.
Вы можете попробовать использовать системный вызов mmap
, если malloc
(который использует системный вызов brk
), имеет какой-то вид вопроса. Обратите внимание, что для GNU libc , malloc
фактически использует mmap
вместо brk
, когда выделение достаточно велико (думаю, более 128k).
Зачем выделять память в первую очередь, а не выделять
переменные и позволить компилятору / системе справиться с этим?
Переменная должна где-то жить в памяти. Вы говорите: «Зачем вручную управлять памятью? Почему какой-то алгоритм не может сделать это для меня?». На самом деле, компилятор и компонент времени выполнения очень часто обрабатывают распределение / освобождение - это называется сборка мусора .