[解決済み] x += a は x = x + a よりも速いか?
質問
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 氏は、おそらくこの点を考慮して
+=
.
関連
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] B "の印刷が "#"の印刷より劇的に遅いのはなぜですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] <は<=より速いのか?
-
[解決済み] \0-9]よりも効率が悪い
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】'cout'は型名ではない
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】Enterキーを押して続行する
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み】'std::cout'への未定義の参照