1. ホーム
  2. c++

[解決済み] 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の読み方を知らなくても、自ずとわかると思います。