Переменные должны быть объявлены как можно локально.
Объявление переменных "наверху функции" всегда является катастрофически плохой практикой. Даже в языке C89 / 90, где переменные могут быть объявлены только в начале блока, лучше объявить их как можно локально, то есть в начале наименьшего локального блока, который охватывает желаемое время жизни переменной. Иногда может даже иметь смысл ввести «избыточный» локальный блок с единственной целью «локализации» объявления переменной.
В C ++ и C99, где можно объявлять переменные в любом месте кода, ответ довольно прост: опять же, объявляйте каждую переменную настолько локально, насколько это возможно, и как можно ближе к точке, где вы ее используете. первый раз. Основное обоснование этого заключается в том, что в большинстве случаев это позволит вам предоставить значимый инициализатор переменной в точке объявления (вместо объявления ее без инициализатора или с фиктивным инициализатором).
Что касается использования памяти, в общем случае типичная реализация немедленно (при вводе функции) выделяет максимальное пространство, необходимое для всех переменных, которые существуют одновременно. Однако ваши привычки декларации могут повлиять на точный размер этого пространства. Например, в этом коде
void foo() {
int a, b, c;
if (...) {
}
if (...) {
}
}
все три переменные существуют одновременно, и, как правило, пространство для всех трех должно быть выделено. Но в этом коде
void foo() {
int a;
if (...) {
int b;
}
if (...) {
int c;
}
}
только две переменные существуют в любой данный момент, это означает, что пространство только для двух переменных будет выделено типичной реализацией (b
и c
будут использовать то же пространство). Это еще одна причина для объявления переменных как можно локально.