アセンブリ コードを確認せずに、プログラムによって関数がインライン化されているかどうかを判断する方法があります。この回答はhereから取得されます。
特定の呼び出しがインライン化されているかどうかを確認したいとします。あなたはこのように行きます。コンパイラは関数をインライン化しますが、エクスポートされる (そしてほとんどすべての関数がエクスポートされる) 関数については、外部から呼び出すことができるインライン化されていないアドレス指定可能な関数コードを維持する必要があります。
関数がインライン化されているかどうかを確認するには、関数ポインター (インライン化されていない) を PC の現在の値とmy_function
比較する必要があります。my_function
私の環境(GCC 7、x86_64)で行った方法は次のとおりです。
void * __attribute__((noinline)) get_pc () { return _builtin_return_address(0); }
void my_function() {
void* pc = get_pc();
asm volatile("": : :"memory");
printf("Function pointer = %p, current pc = %p\n", &my_function, pc);
}
void main() {
my_function();
}
関数がインライン化されていない場合、PC の現在の値と関数ポインターの値の差は小さくなり、そうでない場合は大きくなります。私のシステムでmy_function
は、インライン化されていない場合、次の出力が得られます。
Function pointer = 0x55fc17902500, pc = 0x55fc1790257b
関数がインライン化されている場合、次のようになります。
Function pointer = 0x55ddcffc6560, pc = 0x55ddcffc4c6a
インライン化されていないバージョンの違いは0x7b
であり、インライン化されたバージョンの違いは0x181f
です。