Изложу свои догадки, пусть кто-нибудь меня поправит. Как я понимаю, аппаратным стеком может служить абсолютно любая часть оперативной памяти. Физически он никак не выделен, существует столько, сколько выполняется программа. ОС выделяет по одному стеку на каждую выполняемую программу. Все верно?
Две цитаты:
Цитата:
Дэвид Катлер и его команда выбрали один мегабайт в качестве размера стека по умолчанию. Ничего общего с .NET или С#, это было прибито, когда они создали Windows NT. Один мегабайт - это то, что он выбирает, когда заголовок EXE программы или вызов winapi CreateThread() не задают размер стека явно. Что является нормальным способом, почти любой программист оставляет его ОС для выбора размера.
Цитата:
Третья большая причина переполнения стека — одноразовое выделение огромного количества памяти крупными локальными переменными. Многие авторы рекомендуют выделять память, превышающую несколько килобайт, в «куче», а не на стеке. Пример на Си:
int foo() {
double x[1000000];
}
Массив занимает 8 мегабайт памяти; если в стеке нет такого количества памяти, случится переполнение.
Я понимаю, как вычисляется 8 мегабайт: элементов массива задано миллион штук, каждый из них типа double и занимает 8 байт. Но я не понимаю, почему ограничение в 1 Мб не срабатывает. Достаточно зайти на
http://www.cpp.sh/, и в тот же пример вместо миллиона подставить единицу с 18 нулями. Правда 19 — это уже действительно перебор, и компилятор ругается на ошибку, но 18 проходит без проблем. Какой же тогда выделяется размер стека?