Tout vaut compilateur son sel va générer exactement la même séquence de langage machine pour les deux constructions pour tout type intégré ( int
, float
, etc.) tant que la déclaration est vraiment aussi simple que x = x + a;
et l' optimisation est activée . (Notamment, GCC -O0
, qui est le mode par défaut, effectue des anti-optimisations , telles que l'insertion de magasins complètement inutiles dans la mémoire, afin de s'assurer que les débogueurs peuvent toujours trouver des valeurs de variable.)
Si la déclaration est plus compliquée, cependant, elles peuvent être différentes. Supposons f
qu'une fonction renvoie un pointeur, alors
*f() += a;
n'appelle f
qu'une seule fois, alors que
*f() = *f() + a;
l'appelle deux fois. S'il f
a des effets secondaires, l'un des deux sera faux (probablement le dernier). Même s'il f
n'a pas d'effets secondaires, le compilateur peut ne pas être en mesure d'éliminer le deuxième appel, ce dernier peut donc être plus lent.
Et puisque nous parlons de C ++ ici, la situation est entièrement différente pour les types de classes qui surchargent operator+
et operator+=
. Si x
c'est un tel type, alors - avant l'optimisation - se x += a
traduit par
x.operator+=(a);
alors que se x = x + a
traduit par
auto TEMP(x.operator+(a));
x.operator=(TEMP);
Maintenant, si la classe est correctement écrite et que l'optimiseur du compilateur est assez bon, les deux finiront par générer le même langage machine, mais ce n'est pas une chose sûre comme c'est le cas pour les types intégrés. C'est probablement ce à quoi Stroustrup pense quand il encourage l'utilisation +=
.