Это вы с Java или C# путаете
Я их не знаю (по крайней мере на том уровне, что б делать подобные заявления).
А за С++ готов побиться. На С++ сейчас во всех достаточно больших не трешовых проектах на архитектурном уровне (везде, где использование низкого уровня неоправданно), используют смарт-ссылки. Это статистически более выгодно, чем ловить баги, вызванные неоднозначностью в создании/удалении объектов - хоть в куче, хоть на стеке.
Хотя прибедняюсь конечно, за C# и Java тоже могу в этом контексте постоять. У них, к слову, ссылки обычные, быстрые. Но прилагающийся объем проблем при переходе от смарт-ссылок к обычным, но с Garbage-Collector-ом, особенно в контексте мультизадачных приложений, из моего опыта ни к чему хорошему не приводит. Т.е. задача освобождения памяти в больших мультизадачных приложениях и сервисах - это минимальная из проблем.
-- 01.03.2016, 02:45 --Причём это делает компилятор
Это делает ОС. Она использует данные, которые зашиваются в исполняемый файл, как хинты.
если выделенное под стек адресное пространство не используется, то это просто потерянная память
Нет, это всего лишь потерянное адресное пр-во. Память выделяется по мере его использования. По-странично. Обращение к ранее неиспользованной странице вызывает исключение, ОС выделяет реальную память под это дело и т.д.
Поэтому стараются по умолчанию выделить некоторое компромиссное количество стека
В обычных клиентских 64-х разрядных приложениях под стек можно выделять столько пр-ва, сколько не жалко. К реальной памяти это отношения не имеет. В серверных приложениях даже в 64-х битах стоит осозновать рамки приличия, тем более что сейчас есть сервисы с десятками (сотней) тысяч потоков (соответсвенно стеков).
В теории, можно попробовать использовать всё адресное пространство процесса динамически для кучи и стека - куча растёт снизу вверх, стек сверху вниз
Куча растет как и куда попало, стек растет сверху вниз только для каждого отдельного потока. Для мультизадачных приложений он растет как расческа с разными зубьями.
Учитывая всё это, принято не выделять больших массивов/объектов в стеке, а пользоваться для этого кучей, чтобы не вызвать переполнение стека. Кстати, переполнение стека может очень плохо диагностироваться, прямая проверка в начале каждой функции слишком дорого стоит, чтобы это делать по умолчанию
Это так. Хотя на практике выделение объекта в куче чаще вызвано необходимостью его где-нить запомнить (удержать) за пределами видимости текущих локальных переменных, чем ограниченностью стека.
и не относится, например, к Java
Это зависит от реализации. Java-условно говоря, интерпретируемая среда с хитростями. Можно переносить и уплотнять память (да и стек) во время работы. Далеко не всегда правда это работает эффективно.
-- 01.03.2016, 02:51 --_Ivana, если вы осознанно активно эксплуатируете стек, то нужно либо однозначно понимать, что конкретная реализация вам это позволяет делать, либо сделать свою через кучу. Второй вариант, как правило, не сильно сложнее, но более устойчив.