我一直聽說關鍵字inline
不再適用於現代編譯器,而是用於避免多源項目中的多重定義錯誤。C++`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的。
我懷疑該函數可以在鏈接過程中內聯,但我不確定會發生,如果是這樣,我怎麼知道?
我的問題是,爲什麼這個代碼片段似乎是矛盾的,以現代方針如 When should I write the keyword 'inline' for a function/method?
你已經表明'inline'可能影響決定是否內聯,而不是以任何方式更好。 – delnan
它與'static'聲明或'-flto'標誌內聯。 – zch
您引用問題的評分最高的答案是錯誤的。忽略它。 –