2016-02-10 5 views
1

Supposons que j'ai une fonction appelée périodiquement. La fonction obtient une valeur en tant que paramètre et je veux la comparer à la valeur qui a été reçue lors de l'appel de fonction précédent, c'est-à-dire. la valeur doit être mémorisée. Dois-je utiliser une variable statique non membre ou une variable membre non statique à cette fin? Quels sont les avantages et les inconvénients des deux approches?Utilisation de variables de membre statiques non membres et non statiques en C++

En tant qu'approche non membre statique que je veux dire quelque chose comme

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

Et comme une variable membre non statique quelque chose comme

class foo { 
    private: 
     int lastValue_; 

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

si 'lastValue' est utilisé uniquement en fonction, je pense qu'il est raisonnable d'utiliser l'approche statique –

+0

Oui, dans ce cas, il est utilisé que dans une seule fonction. – blomm444

+0

@AlexeyAndronov Dans ce cas, toutes les instances de 'class foo' partageront la même' lastValue' via 'func()'. Alors qu'avec la variable membre non statique, chaque instance a sa propre memoisation. Cela peut ou non être requis ici, mais c'est une différence très importante à noter. –

Répondre

3

Tout d'abord, vous devez ajouter une initialisation du non staticlastValue_ variable membre - comme vous avez un comportement indéfini. (La variable fonction locale static sera initialisé à 0, qui peut ou ne vous convient pas.)

Quels sont les avantages et les inconvénients pour les deux approches?

  • En utilisant une variable membre non statique signifie que le programme peut créer autant de foo instances comme ils aiment, et ils fonctionnent de façon indépendante. Deux threads ne doivent pas accéder au même objet foo sans synchronisation, mais ils peuvent accéder à foo instances auxquelles les autres threads n'accèdent pas, y compris les instances foo spécifiques au thread. Avoir une variable membre non statique peut également faciliter le test d'unité et de régression, car la simple création d'un nouvel objet réinitialisera l'état, alors qu'avec une variable fonction locale static, il n'y a pas de moyen facile pour restaurer la valeur de départ (vous devez pirater un argument de fonction qui le demande). La variable fonction locale static a l'avantage d'être plus localisée dans le sens de l'accessibilité à partir d'un autre code, ce qui indique qu'elle n'est pertinente que pour la fonction . L'utilisation de la portée variable la plus étroite possible est normalement souhaitable, mais ici, ceci est massivement moins important que les points ci-dessus.

  • Plus généralement - de plusieurs façons, la variable fonctionnelle locale static présente les mêmes problèmes que les variables globales ou les singletons - Google les créera très intelligemment.