Есть ли веская причина для инициализации статической переменной при каждом вызове функции, где она определена?
Коллега выполняет некоторую проверку кода, и он видит много объявлений статических переменных, похожих на следующее:
void someFunc(){
static int foo;
static int bar;
static int baz;
foo = 0;
bar = 0;
baz = 0;
/*
rest of the function code goes here
*/
}
Наш вопрос:
Являются ли программисты, которые написали этот код, просто неясны в концепции статической переменной,
или есть какая-то умная причина сделать это специально?
Если это имеет значение, среда представляет собой встроенный микроконтроллер, а компилятор - GCC.
Ответы
Ответ 1
Если бы это была не встроенная система, вы, вероятно, были бы правы: я бы поспорил, что программисты не поняли концепцию статики и должны были написать это:
static int foo = 0;
static int bar = 0;
static int baz = 0;
Однако во встроенной системе они могли бы использовать static
, чтобы избежать выделения переменных в автоматическом хранилище (то есть в стеке). Это может сэкономить несколько циклов процессора, поскольку адрес статической переменной будет "запекаться" в двоичном коде скомпилированного метода.
Ответ 2
В этом контексте статическая память выделяется только один раз. Проблема с этим кодом - инициализация. Если это значение reset при каждом выполнении, эти переменные должны существовать в стеке.
Ответ 3
Реализация функции, как она есть, подрывает преимущества static
. Основными причинами использования static
являются следующие:
- Наличие переменной, которая поддерживает ее значение между вызовами одной и той же функции
- Избегайте выделения памяти в стеке
@dasblinkenlight ответ относится ко второму варианту, однако в встроенном программировании нет никого, кто бы потратил неиспользуемую память, чтобы сохранить 24 байта (при условии, что int
- 32 байта в вашей архитектуре) в стеке. Причина в том, что компилятор будет манипулировать указателем стека, входящим в функцию, независимо от того, и поэтому нет ничего, что можно было бы сохранить (с точки зрения циклов) из-за того, что он не нажимал SP еще на 24 байта.
Помня об этом, мы остаемся с возможностью, чтобы пользователь хотел сохранить некоторую информацию относительно foo
, bar
и baz
между вызовами. Если это также не так, то, что вы смотрите, это плохое программирование.
Ответ 4
статические преимущества. являются:
Наличие переменной, которая поддерживает ее значение между вызовами одной и той же функции
Избегайте выделения памяти в стеке