1
以下兩個代碼片段會生成完全相同的彙編代碼,即使分支包含在不同的分支預測中。gcc __builtin_expect似乎沒有生成正確的代碼
比方說,我們有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();
}
}
正如你可以看到通過比較兩個片段,這兩個有不同的分支預測的每個分支(可能()與不可能())。
但是,當它從一個Linux的盒子(Ubuntu 12.04 32位,GCC 4.6.3)編譯。這兩個來源產生幾乎相同的產出。
$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"
如果有人能解釋這一點,這將是一個很大的幫助。 感謝您的幫助!
是的,你是對的!我還修復了代碼。非常感謝你的幫助! – kjee 2013-03-27 18:28:23
@ user1036234 - 不客氣 – teppic 2013-03-27 18:42:37