Вам все равно, и это зависит много от флагов оптимизации и компилятора .
Переменная может оставаться целиком в регистре процессора , и тогда она не потребляет память (и иногда она не появляется в сгенерированном машинном коде, потому что компилятор вычислил что это бесполезно). Но читайте о стеке вызовов и кадрах вызовов и распределении регистров . Конечно, правило здравого смысла состоит в том, чтобы избегать огромных кадров вызовов (например, избегать объявления очень больших автоматических переменных , таких как double hugelocalarr[1000000];
). Разумный кадр вызова должен (в общем случае) составлять не более килобайта или нескольких из них (часто общий стек вызовов не должен превышать мегабайт или несколько из них, и вам необходимо подумать о рекурсивных функциях или глубоко вложенных вызовах) .
На практике, если вы компилируете с GCC , посмотрите на опции команды , такие как -Wstack-usage=
X (используйте ее с различными флагами оптимизации, такими как -O1
или -O2
...) и т. Д. ... Вы получите предупреждения о функциях, использующих большой стек (больше, чем X байт).
Знайте также о оконечных вызовах . Последние компиляторы иногда могут их умно оптимизировать. И подумайте также о встроенном расширении . Компиляторы могут сделать это при оптимизации (даже без любое ключевое слово inline
).
Прочитайте C не является языком низкого уровня статья Дэвида Чисналла.