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);
}
用命令
g++ -O3 -S a.cpp
,可以生成汇编代码,但是 func
没有内联。如果在
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。
我怀疑该函数在链接过程中可以进行内联,但我不确定是否会发生这种情况,如果是的话,我该如何知道?
我的问题是,为什么这段代码片段似乎与现代指南相矛盾,例如何时应为函数/方法编写关键字“inline”?
inline
可能会影响内联的决策,但并没有证明它在任何方面都更好。 - user395760static
声明或者-flto
标志相一致。 - zch-fwhole-program
或-flto
)可以改变这种情况,同时给函数添加内部链接(匿名命名空间)也可以。在原始情况下,一旦编译器生成了外部函数体,它认为调用该函数比在主函数中复制代码更加方便。 - Kerrek SB