Статические локальные переменные в методах плохая практика? - PullRequest
8 голосов
/ 29 декабря 2010

что-то меня беспокоит.

В непоточной программе лучше иметь локальные статические переменные (внутри методов) или статические члены класса?

В этом примере:

class C{
public: 
  C(){};
  void foo();
};

void C::foo(){
  static int bar = 0;
  bar++;
  printf("%d\n",bar);
}

Считается ли это плохой практикой, если bar будет использоваться исключительно в C::foo()?

Ответы [ 5 ]

7 голосов
/ 29 декабря 2010

Ни лучше. Они обслуживают очень разные случаи использования

4 голосов
/ 29 декабря 2010

Обычно я стараюсь максимально ограничить область видимости переменных, если это не становится странным или утомительным.

Если у вас есть 1000 строк кода в class C, из них 100строк кода в функции foo, любое изменение, которое вы вносите в bar (например, изменение имени или типа), требует более 100 строк кода, чтобы убедиться, что изменение в порядке.Если у вас bar статический член класса, вам, возможно, придется пройти более 1000 строк кода, просто чтобы убедиться, что bar там не используется.Это было бы пустой тратой времени.

Если вы считаете, что вам может понадобиться bar в другой функции foo2 (например, при подсчете количества вызовов для foo и foo2 вместе), вы можетехочу сделать bar статическим членом класса.

2 голосов
/ 29 декабря 2010

Если это открытый класс, член статического класса требует редактирования файла заголовка.Это не всегда желательно.

Другой вариант - это переменная в области файлов, в анонимном пространстве имен.Этого достаточно, если вам нужен доступ только в одном методе, и если вам нужен множественный.

0 голосов
/ 29 декабря 2010

И локальные, и нелокальные глобальные переменные являются «плохими» в силу того, что они глобальные. Но инициализация и доступ для этих двух случаев различны, поэтому ответ на вопрос зависит от ваших потребностей в отношении этих требований.

В качестве примечания, динамическая инициализация локальных переменных со статической продолжительностью хранения может быть не поточно-ориентированной, в зависимости от вашего компилятора. Хорошая новость: в C ++ 0x он гарантированно безопасен для потоков.

0 голосов
/ 29 декабря 2010

Объектно-ориентированный говорящий, bar является частью состояния класса C. Именно поэтому я обычно предпочитаю использовать поля, а не статические локальные переменные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...