Tuzuna değer herhangi bir derleyici, herhangi bir yerleşik tür için her iki yapı için de tam olarak aynı makine dili sırasını üretecektir ( int
,float
uzun deyimi gerçekten olarak basit olarak olduğu kadar, vs) x = x + a;
ve optimizasyon etkindir . (Özellikle, -O0
varsayılan mod olan GCC'ler anti-optimizasyonlar gerçekleştirir hata ayıklayıcıların her zaman değişken değerleri bulabilmesini sağlamak için belleğe tamamen gereksiz depolar eklemek gibi .)
İfade daha karmaşıksa, farklı olabilirler. f
Bir işaretçi döndüren bir işlev olduğunu varsayalım , sonra
*f() += a;
f
yalnızca bir kez arar , oysa
*f() = *f() + a;
iki kere arar. f
Yan etkileri varsa , ikisinden biri yanlış olacaktır (muhtemelen ikincisi). f
Yan etkileri olmasa bile , derleyici ikinci çağrıyı ortadan kaldıramayabilir, bu nedenle ikincisi gerçekten daha yavaş olabilir.
Ve burada C ++ hakkında konuştuğumuz için, aşırı yüklenen sınıf türleri için durum tamamen farklıdır operator+
ve operator+=
. Eğer x
optimizasyonu önce - - o zaman böyle bir türüdür x += a
çevirir
x.operator+=(a);
oysa x = x + a
çevirir
auto TEMP(x.operator+(a));
x.operator=(TEMP);
Şimdi, eğer sınıf düzgün bir şekilde yazılmışsa ve derleyicinin optimize edicisi yeterince iyiyse, her ikisi de aynı makine dilini üretecek, ancak yerleşik tipler için olduğu gibi kesin bir şey değil. Bu muhtemelen Stroustrup'un kullanımını teşvik ettiğinde düşündüğü şeydir +=
.