gcc可能()不可能()宏和汇编代码
我试图了解gcc的gcc可能()不可能()宏和汇编代码,gcc,compiler-optimization,Gcc,Compiler Optimization,我试图了解gcc的aliked()和aliked()分支预测宏对汇编代码的影响。在下面的代码段中,无论我使用哪个宏,我都看不到生成的汇编代码有任何差异。对发生的事情有什么指示吗 0 int main() { 1 volatile int x; 2 unlikely(x)?x++:x--; 3 } Asm代码: 0 0000000000000014 <main>: 1 int main() { 2 14: 55
aliked()
和aliked()
分支预测宏对汇编代码的影响。在下面的代码段中,无论我使用哪个宏,我都看不到生成的汇编代码有任何差异。对发生的事情有什么指示吗
0 int main() {
1 volatile int x;
2 unlikely(x)?x++:x--;
3 }
Asm代码:
0 0000000000000014 <main>:
1 int main() {
2 14: 55 push rbp
3 15: 48 89 e5 mov rbp,rsp
4 volatile int x;
5 likely(x)?x++:x--;
6 18: 8b 45 fc mov eax,DWORD PTR [rbp-0x4]
7 1b: 85 c0 test eax,eax
8 1d: 0f 95 c0 setne al
9 20: 0f b6 c0 movzx eax,al
10 23: 48 85 c0 test rax,rax
11 26: 74 0b je 33 <main+0x1f>
12 28: 8b 45 fc mov eax,DWORD PTR [rbp-0x4]
13 2b: 83 c0 01 add eax,0x1
14 2e: 89 45 fc mov DWORD PTR [rbp-0x4],eax
15 31: eb 09 jmp 3c <main+0x28>
16 33: 8b 45 fc mov eax,DWORD PTR [rbp-0x4]
17 36: 83 e8 01 sub eax,0x1
18 39: 89 45 fc mov DWORD PTR [rbp-0x4],eax
19 }
20 3c: 5d pop rbp
21 3d: c3 ret
0 00000000000000 14:
1 int main(){
2 14:55按rbp
3 15:48 89 e5 mov rbp,rsp
4.x;
5可能(x)?x++:x--;
6 18:8b 45 fc mov eax,DWORD PTR[rbp-0x4]
7 1b:85 c0测试eax,eax
8 1d:0f 95 c0 setne al
9 20:0f b6 c0 movzx eax,al
10 23:48 85 c0测试rax,rax
11 26:74 0b日本脑炎33
12 28:8b 45 fc mov eax,DWORD PTR[rbp-0x4]
13 2b:83 c0 01添加eax,0x1
14 2e:89 45 fc mov DWORD PTR[rbp-0x4],eax
15 31:eb 09 jmp 3c
16 33:8b 45 fc mov eax,DWORD PTR[rbp-0x4]
17 36:83 e8 01子eax,0x1
18 39:89 45 fc mov DWORD PTR[rbp-0x4],eax
19 }
20 3c:5d pop rbp
21 3d:c3 ret
看起来您在编译时没有进行优化。是一种优化,因此如果没有它,\u内置\u expect
就不会有这种效果。通过优化,我观察到在切换预期结果时,分支的意义是颠倒的
请注意,这对当前的x86处理器是否有任何影响很难说。在x86上不太可能有减慢代码的效果,请阅读此处: