Вот простое правило: объявляйте переменную в самой узкой области, в которой вы будете ее использовать.
Что касается объяснения , почему : в C и C ++ (и других языках) переменные по сути "перестают существовать", когда они выходят из области видимости. Если вы объявляете переменную вне функции, эта переменная обрабатывается и сохраняется в памяти перед вызовом функции. Каждый раз, когда вы вызываете функцию и используете эту переменную, к ней обращается один и тот же бит памяти, и в результате переменная сохраняет свое значение между вызовами.
Между тем, если вы объявите переменную внутри функции (например, в C / C ++, я думаю, что что-либо с фигурными скобками в ней определяет более узкую область видимости), она будет выделена и сохранена в памяти только когда это входит в сферу . Когда эта область заканчивается (например, с помощью оператора return
в конце метода), освобождается вся память, которая была в этой области.
Все это связано со стеком , который является одним из двух основных способов обработки динамической памяти в C и C ++. Вот полезный обзор того, как программы на C распределяют память ; достаточно сказать, что приведенные выше эмпирические правила заключаются в том, что
- вы не хотите использовать больше памяти, чем вам нужно в любой момент времени . Другими словами, вы не хотите, чтобы переменная сидела без дела, которую вы никогда не собираетесь использовать.
- Гораздо проще отладить проблему, когда переменная имеет ограниченную область видимости, и вы знаете все, что может повлиять на нее, чем когда она находится в глобальной области видимости и все может влиять на нее