[解決済み] if (flag=0)とif (0==flag)はどちらが速く実行されますか?
2022-09-05 05:07:41
質問
インタビューの質問です。どちらが実行速度が速いですか?
if (flag==0)
と
if (0==flag)
? なぜ?
どのように解決するのですか?
まだ正解を見たことがありません(既に正解はあります)。 注意: Nawaz はユーザー定義の罠を指摘しました。 . そして、私は、多くの人がそれを正しく理解していなかったようなので、コンパイラの最適化に関する素晴らしい議論のための部屋を与えるので、"最も愚かな質問" に急いで投げられたupvoteを後悔します :) 。
答えは
とは
flag
の型は何ですか?
の場合
flag
が実際にユーザー定義型である場合。では、どのオーバーロードの
operator==
のどのオーバーロードが選択されるかに依存します。もちろん、それらが対称的でないことは愚かだと思われるかもしれませんが、確かにそれは許されることであり、私はすでに他の悪用を見てきました。
もし
flag
が組み込みであれば、どちらも同じ速度になるはずです。
から
ウィキペディアの記事
について
x86
のために賭ける。
Jxx
の指示で
if
文: おそらく
JNZ
(Jump if Not Zero) または同等のものです。
最適化をオフにしても、コンパイラがこのような明白な最適化を見落とすとは思えません。このようなタイプのものには のぞき穴の最適化 はそのために設計されています。
EDITです。 また湧いてきたので、アセンブリを追加してみましょう(LLVM 2.7 IR)。
int regular(int c) {
if (c == 0) { return 0; }
return 1;
}
int yoda(int c) {
if (0 == c) { return 0; }
return 1;
}
define i32 @regular(i32 %c) nounwind readnone {
entry:
%not. = icmp ne i32 %c, 0 ; <i1> [#uses=1]
%.0 = zext i1 %not. to i32 ; <i32> [#uses=1]
ret i32 %.0
}
define i32 @yoda(i32 %c) nounwind readnone {
entry:
%not. = icmp ne i32 %c, 0 ; <i1> [#uses=1]
%.0 = zext i1 %not. to i32 ; <i32> [#uses=1]
ret i32 %.0
}
IRの読み方を知らなくても、自ずとわかると思います。
関連
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] mallocの結果はキャストするのですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] ムーブセマンティクスとは何ですか?
-
[解決済み] <は<=より速いのか?
-
[解決済み] 0.1fを0にすると、なぜ10倍もパフォーマンスが落ちるのですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】構造体のベクター初期化について
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】システムが指定されたファイルを見つけられませんでした。