最近的文章
C++ inline & static
·2 分钟
inline # inline cppreference
内联展开 # 以下面这段代码为例:
const char* num_check(int v) { return (v % 2 > 0) ? "奇" : "偶"; } int main() { for (int i = 0; i <= 99; i++) printf("%02d %s\n", i, num_check(i)); } 未开启优化时编译,可以看到 num_check 是正常的函数调用(call num_check(int)):
.LC0: .string "\345\245\207" .LC1: .string "\345\201\266" num_check(int): push rbp mov rbp, rsp mov DWORD PTR [rbp-4], edi mov edx, DWORD PTR [rbp-4] mov eax, edx sar eax, 31 shr eax, 31 add edx, eax and edx, 1 sub edx, eax mov eax, edx test eax, eax jle .L2 mov eax, OFFSET FLAT:.LC0 jmp .L4 .L2: mov eax, OFFSET FLAT:.LC1 .L4: pop rbp ret .LC2: .string "%02d %s\n" main: push rbp mov rbp, rsp sub rsp, 16 mov DWORD PTR [rbp-4], 0 jmp .L6 .L7: mov eax, DWORD PTR [rbp-4] mov edi, eax call num_check(int) mov rdx, rax mov eax, DWORD PTR [rbp-4] mov esi, eax mov edi, OFFSET FLAT:.LC2 mov eax, 0 call printf add DWORD PTR [rbp-4], 1 .L6: cmp DWORD PTR [rbp-4], 99 jle .L7 mov eax, 0 leave ret 开启 -O1 后编译器会自动将函数内联展开,消除函数调用开销: