Есть ли веская причина для инициализации статической переменной при каждом вызове функции, где она определена?

Коллега выполняет некоторую проверку кода, и он видит много объявлений статических переменных, похожих на следующее:

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

статические преимущества. являются:

Наличие переменной, которая поддерживает ее значение между вызовами одной и той же функции Избегайте выделения памяти в стеке