2016-02-10 3 views
1

Предположим, что у меня есть функция, которая вызывается периодически. Функция получает значение как параметр, и я хочу сравнить его со значением, полученным во время более раннего вызова функции, т. Е. значение нужно запомнить. Должен ли я использовать статическую не-членную переменную или нестационарную переменную-член для этой цели? Каковы преимущества и недостатки обоих подходов?Использование статических не-членных и нестатических переменных-членов в C++

В статическом подходе, не являющегося членом, я имею в виду что-то вроде

class foo { 
    public: 
     void func(int value) { 
      static int lastValue; 
      if (value > lastValue) { 
       doSomething(value) 
      } 
      lastValue = value; 
    }; 
}; 

И как нестатической член переменной что-то вроде

class foo { 
    private: 
     int lastValue_; 

    public: 
     void func(int value) { 
      if (value > lastValue_) { 
       doSomething(value) 
      } 
      lastValue_ = value; 
     }; 
}; 
+0

если 'lastValue' используется только в функции я думаю, что это разумно использовать статический подход –

+0

Да, в этом случае используется только в одной функции. – blomm444

+0

@AlexeyAndronov В этом случае все экземпляры 'class foo' будут использовать один и тот же' lastValue' через 'func() '. В то время как с нестатической переменной-членом каждый экземпляр имеет свою собственную memoisation. Это может быть или не потребоваться здесь, но это очень важная разница. –

ответ

3

Во-первых, вы должны добавить инициализацию не- staticlastValue_ переменная-член - как есть неопределенное поведение. (The static функция локальной переменной будет инициализируется 0, которые могут или не могут удовлетворить вас.)

Каковы преимущества и недостатки обоих подходов?

  • Использование переменной нестатический члена означает, что программа может создать столько foo экземпляров, как им нравится, и они будут работать независимо друг от друга. Ни один из двух потоков не должен обращаться к одному объекту foo без синхронизации, но они могут получить доступ к foo экземплярам, ​​к которым не обращаются другие потоки, включая любые экземпляры foo с потоком.

  • Наличие нестатической переменной-члена также может облегчить работу с модулем и регрессионным тестом, поскольку простое создание нового объекта будет «перезагружать» состояние, тогда как с помощью функции-локальной переменной static нет простого способа для восстановления начального значения (вы должны взломать аргумент функции, который запрашивает это).

  • Переменная функции-local static имеет то преимущество, что она более локализована в смысле доступности из другого кода, что делает ее понятной только для функции func. Как правило, желательно использовать максимально возможную область видимости, но здесь это значительно менее важно, чем точки выше.

  • В общем случае переменная функции-local static имеет те же проблемы, что и глобальные переменные или синглтоны - google будет очень хорошо их использовать.