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
ただし、 の定義の前に 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 です。
リンク プロセス中に関数がインライン化される可能性があると思われますが、インライン化されるかどうかはわかりません。
私の質問は、このコード スニペットが 、関数/メソッドのキーワード「インライン」をいつ書くべきかなどの最新のガイドラインと矛盾しているように見える理由です。