我一直听说该inline
关键字不再用作现代编译器的提示,而是用于避免多源项目中的多重定义错误。
但是今天我遇到了一个编译器服从关键字的例子。
没有inline
关键字,下面的代码
#include <iostream>
using namespace std;
void func(const int x){
if(x > 3)
cout << "HAHA\n";
else
cout << "KKK\n";
}
int main(){
func(5);
}
使用 command g++ -O3 -S a.cpp
,生成func
未内联的汇编代码。
但是,如果我在 的定义前添加 inline 关键字func
,func
则会内联到main
.
生成的汇编代码的一部分是
.LC0:
.string "HAHA\n"
.LC1:
.string "KKK\n"
.text
.p2align 4,,15
.globl _Z4funci
.type _Z4funci, @function
_Z4funci:
.LFB975:
.cfi_startproc
cmpl $3, %edi
jg .L6
movl $4, %edx
movl $.LC1, %esi
movl $_ZSt4cout, %edi
jmp _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l
.p2align 4,,10
.p2align 3
main:
.LFB976:
.cfi_startproc
subq $8, %rsp
.cfi_def_cfa_offset 16
movl $5, %edi
call _Z4funci
xorl %eax, %eax
addq $8, %rsp
.cfi_def_cfa_offset 8
ret
.cfi_endproc
我的编译器是 gcc 4.8.1 / x86-64。
我怀疑该函数可以在链接过程中内联,但我不确定这会发生,如果是这样,我怎么知道?
我的问题是为什么这个代码片段似乎与现代指南相矛盾,例如 我何时应该为函数/方法编写关键字“内联”?