Un compilateur qui vaut son sel va générer exactement le même langage machine séquence pour les deux constructions pour n'importe quel type (int
, float
, etc) tant que l'état est vraiment aussi simple que d' x = x + a;
et l'optimisation est activée. (Notamment, du CCG -O0
, qui est le mode par défaut, effectue anti-optimisations, comme l'insertion d'complètement inutile, les magasins de la mémoire, afin de s'assurer que les débogueurs pouvez toujours trouver les valeurs d'une variable.)
Si l'instruction est plus compliqué, même si, ils peuvent être différents. Supposons f
est une fonction qui retourne un pointeur, puis
*f() += a;
appels f
qu'une seule fois, alors que
*f() = *f() + a;
il appelle deux fois. Si f
a des effets secondaires, l'un des deux sera fausse (probablement la dernière). Même si f
n'ont pas d'effets secondaires, le compilateur ne peut pas être en mesure d'éliminer le deuxième appel, celui-ci peut en effet être plus lent.
Et puisque nous parlons de C++ ici, la situation est complètement différente pour les types de classe qui surcharge operator+
et operator+=
. Si x
est un type, puis, avant d'optimisation -- x += a
se traduit par
x.operator+=(a);
alors qu' x = x + a
se traduit par
auto TEMP(x.operator+(a));
x.operator=(TEMP);
Maintenant, si la classe est bien écrit et le compilateur optimiseur est assez bon, les deux sera le vent de générer le même langage machine, mais ce n'est pas quelque chose de sûr, comme il est de type intégré. C'est probablement ce Stroustrup est en pensant, quand il encourage l'utilisation de l' +=
.