1. ホーム
  2. c++

[解決済み] x += a は x = x + a よりも速いか?

2023-06-12 13:28:35

質問

Stroustrupのquot;The C++ Programming Language"を読んでいたのですが、彼は次のように言っています。 変数に何かを追加する2つの方法のうち

x = x + a;

x += a;

彼の好みは += の方が実装が優れている可能性が高いからだそうです。私は、彼がより速く動作することを意味していると思います。

でも、本当にそうなんでしょうか?コンパイラなどに依存するのであれば、どのように確認すればいいのでしょうか?

どのように解決するのですか?

どんなコンパイラでも、どんな組み込み型( int , float など)。 x = x + a; であり、最適化が有効である限り . (注目すべきは、GCC の -O0 は、デフォルトのモードである 反最適化 例えば、デバッガが常に変数値を見つけられるようにするために、メモリに完全に不要なストアを挿入するなど)。

しかし、ステートメントがより複雑である場合、それらは異なるかもしれません。 例えば f がポインタを返す関数だとすると

*f() += a;

コール f を一度だけ呼び出すのに対し

*f() = *f() + a;

は2回呼び出します。 もし f に副作用がある場合、2つのうちどちらかが間違っていることになります(おそらく後者でしょう)。 たとえ f が副作用を持たないとしても、コンパイラは2番目の呼び出しを排除できないかもしれないので、後者の方が実際に遅いかもしれません。

また、ここではC++について話しているので、オーバーロードするクラス型については状況が全く異なります。 operator+operator+= . もし x がそのような型である場合、 -- 最適化の前に-- x += a は次のように翻訳されます。

x.operator+=(a);

ここで x = x + a は次のように変換されます。

auto TEMP(x.operator+(a));
x.operator=(TEMP);

さて、クラスが適切に記述されていれば が適切に記述されていれば、コンパイラのオプティマイザが十分に働いて、どちらも同じ機械語を生成することになりますが、組み込み型の場合のように確実にそうなるわけではありません。 Stroustrup 氏は、おそらくこの点を考慮して += .