main()
{
{
new array1[500];
#pragma unused array1
}
{
new array2[500];
#pragma unused array2
}
/*
Хоть вместе размер двух массивов сверху будет равен 1000,
на деле под массивы будет выделено всего 500 ячеек стека, так как
оба находятся в отдельных блоках кода и каждый раз, когда
обработка конкретного блока кода будет завершена, массив будет удаляться из
стека и занимаемое им место станет доступно для другого массива.
*/
/*
С функциями работает практически тот же принцип (одна функция - один отдельный блок кода).
И, в итоге, при вычислении потребляемого стека, компилятор будет ориентироваться на функцию,
которая потребляет больше всего стека, а не будет складывать размер потребляемого стека всех функций.
То бишь, функция начала обрабатываться, создала все свои локальные переменные и когда обработка закончилась,
все переменные из памяти удаляются. Поэтому компилятор учитывает размер самой "тяжёлой" функции, так как в таком
случае этого размера хватит для всех остальных функций. В общем, тот же самый принцип, что и при рассчёте примера выше.
*/
SomeFunc1();
SomeFunc2();
/*
Но весь нюанс заключается в том, что хоть на этапе, когда дело дойдёт до вызова функций,
массивы уже не будут существовать в памяти и функции, по идее, должны занимать стек,
который занимали массивы, компилятор этого не учитывает и просто складывает потребляемое массивами
количество ячеек с тем, которое потребляется функциями.
То бишь, при расчёте размера стека отдельно учитывается размер для переменных и отдельно размер для функций,
а после они складываются.
*/
}
stock SomeFunc1()
{
new array[500];
#pragma unused array
}
stock SomeFunc2()
{
new array[200];
#pragma unused array
}