我正在编译以下简单的演示函数:
int add(int a, int b) {
return a + b;
}
自然地,这个函数会被内联,但我们假设它是动态链接的,或者由于其他原因没有内联。禁用优化后,编译器会生成预期的代码:
00000000 <add>:
0: 55 push ebp
1: 89 e5 mov ebp,esp
3: 8b 45 0c mov eax,DWORD PTR [ebp+0xc]
6: 03 45 08 add eax,DWORD PTR [ebp+0x8]
9: 5d pop ebp
a: c3 ret
由于该函数内部没有函数调用,因此 0、1 和 9 处的指令似乎没有任何用途。由于优化被禁用,这是可以接受的。
但是,在使用 优化大小的同时进行编译时-Os -s
,会生成完全相同的代码。使用这些选项将函数的大小增加 66% 似乎相当浪费。
为什么代码没有针对以下进行优化?
00000000 <add>:
0: 8b 45 0c mov eax,DWORD PTR [esp+0x8]
3: 03 45 08 add eax,DWORD PTR [esp+0x4]
6: c3 ret
编译器只是不认为这值得优化,还是与函数对齐等其他细节有关?