1

次の 2 つのコード スニペットは、分岐が異なる分岐予測で囲まれているにもかかわらず、まったく同じアセンブリ コードを生成します。

test0.cがあるとしましょう

#define likely(x)       __builtin_expect((x), 1)
#define unlikely(x)     __builtin_expect((x), 0)

int bar0();
int bar1();
int bar2();
int bar3();

int foo(int arg0) {
  if (likely(arg0 > 100)) {
    return bar0();
  } else if (likely(arg0 < -100)) {
    return bar1();
  } else if (likely(arg0 > 0)) {
    return bar2();
  } else {
    return bar3();
  }
}

およびtest1.c

#define likely(x)       __builtin_expect((x), 1)
#define unlikely(x)     __builtin_expect((x), 0)

int bar0();
int bar1();
int bar2();
int bar3();

int foo(int arg0) {
  if (unlikely(arg0 > 100)) {
    return bar0();
  } else if (unlikely(arg0 < -100)) {
    return bar1();
  } else if (unlikely(arg0 > 0)) {
    return bar2();
  } else {
    return bar3();
  }
}

2 つのスニペットを比較するとわかるように、これら 2 つのスニペットでは、分岐ごとに異なる分岐予測が行われます (likely() と similar() の比較)。

ただし、Linux ボックス (ubuntu 12.04 32bit、gcc 4.6.3) からコンパイルした場合。これら 2 つのソースは、実質的に同じ出力を生成します。

$gcc  -c -S -o test0.s test0.c
$gcc  -c -S -o test1.s test1.c
$ diff test0.s test1.s
1c1
<   .file   "test0.c"
---
>   .file   "test1.c"

誰かがこれを説明できれば、それは大きな助けになります。事前にご協力いただきありがとうございます。

4

2 に答える 2

3

あなたが投稿した 2 つのファイルは同一です。これはあなたが実際に行ったことではないと思います。

以上でコンパイルすると-O2、最適化をオンにする必要があります。これにより、別のコードが生成されます。

于 2013-03-27T16:42:42.437 に答える