Это может уменьшить "верхнюю отметку" использования стека для вашей программы, и если так, то может уменьшить общее требование к памяти программы.
Да, это зависит от оптимизации. Если оптимизатор встроит вызовы функций, вы можете обнаружить, что все переменные всех встроенных функций заключены в один большой кадр стека. Любой компилятор, который стоит использовать, способен вставлять [*], поэтому тот факт, что это может произойти, не зависит от компилятора. Точно, когда это произойдет, будет отличаться.
Если ваши локальные переменные малы, то ваша программа довольно редко использует больше стека, чем было автоматически выделено вам при запуске. Если вы не пройдете то, что вам дали изначально, то, сколько вы используете, не влияет на общие требования к памяти.
Если вы помещаете в стек огромные структуры (несколько килобайт) или если вы работаете на машине, где килобайт занимает много памяти, это может повлиять на общее использование памяти. Итак, если под «множеством локальных переменных» вы подразумеваете несколько десятков int
с и указателей, то нет, ничего, что вы делаете, не имеет существенного значения. Если под «большим количеством локальных переменных» вы подразумеваете несколько десятков буферов по 10 тыс., Или если ваша функция рекурсивно разворачивается так, что у вас есть сотни уровней из ваших нескольких десятков int
с, то, по крайней мере, это может иметь значение в зависимости от ОС и конфигурации.
Модель, в которой стек и куча растут навстречу друг другу через общую оперативную память, а свободная память в середине может использоваться в равной степени любым из них, устарела. За исключением очень немногих, очень ограниченных систем, модели памяти больше не проектируются таким образом. В современных ОС у нас есть так называемая «виртуальная память», и пространство стека выделяется вашей программе по одной странице за раз. Большинство из них автоматически выделяют больше страниц стека по мере его использования, вплоть до настроенного лимита, который обычно очень велик. Некоторые не расширяют стек автоматически (последний раз, когда я использовал его в Symbian, что было несколько лет назад, этого не произошло, хотя, возможно, Symbian не является «современной» ОС). Если вы используете встроенную ОС, проверьте, что говорится в руководстве о стеке.
В любом случае, единственное, что влияет на общее использование памяти, - это сколько страниц стека вам нужно за один раз. Если ваша система автоматически расширяет стек, вы даже не заметите, сколько вы используете. Если этого не произойдет, вам нужно убедиться, что программе предоставлен достаточный стек для ее максимальной отметки, и тогда вы можете заметить чрезмерное использование стека.
Короче говоря, это одна из тех вещей, которая в теории имеет значение, но на практике эта разница почти всегда незначительна. Это имеет значение только в том случае, если ваша программа использует огромное количество стеков относительно ресурсов среды, в которой она выполняется.
[*] Людям, программирующим на C для PIC или чего-то подобного, использующим компилятор C, который по сути является неоптимизирующим ассемблером, разрешается оскорблять, что я назвал их компилятор «не стоящим». Стек на таких устройствах настолько отличается от «типичных» систем, что в любом случае ответ будет другим.