gcc のドキュメントを読んだとき、 inline (またはinline ) キーワードによって関数呼び出しのオーバーヘッドが取り除かれると思いました。
私が引用したように: " GCC がこれを達成できる 1 つの方法は、その関数のコードをその呼び出し元のコードに統合することです。これにより、関数呼び出しのオーバーヘッドがなくなるため、実行が高速化されます。さらに、実際の引数の値のいずれかが定数である場合、それらの既知の値を使用すると、コンパイル時に単純化できるため、インライン関数のコードをすべて含める必要はありません。" Gcc マニュアル 6.36
したがって、次の C コードを想定しました。
__inline__ int sum(int a, int b)
{
return a+b;
}
int add_one(int a)
{
return sum(a, 1);
}
に変換されます
add_one:
mov eax, [ebp-4]
add eax, 0x01
retn
それ以外の:
add_one:
push 0x01
push [ebp-4]
call sum
retn
思い通りにいかないので質問させていただきます。関数を含むオブジェクト ファイルがあります。シンボル _my_func をエクスポートします。次のコードで C コードを取得しました。
extern __inline__ _my_func
int main(int argc, char **argv)
{
_my_func(argv[1]);
_my_func(argv[2]);
}
オブジェクトのコードをメイン関数内にマージするにはどうすればよいですか? たとえば、呼び出しと関数のオーバーヘッドを削除します。
ありがとう
ストラス
ところで、ここでも ( __inline__ とはどういう意味ですか? )関数のオーバーヘッドを取り除く必要があることに気付きました。しかし、objdumpはそうではないと言います:S
更新後の投稿:
次のコマンドでも:
nasm -felf get42.s -o42.o
gcc O3 42.o main.c -o mybin.elf
objdump -d mybin.elf
次のような小さな呼び出しに気付きました。
<_get42>:
xor eax, eax
mov eax, 0x42
ret
<main>:
push ebp
mov ebp, esp
add esp, 0xfffffff0
call _get42
leave
ret
ところで、関数の(mov ebp、espなど)オーバーヘッドが削除されたことに気づきました。しかし、それだけですか?関数内の実際のコードで呼び出しを削除したいだけなので..呼び出しを削除する場合と同様に、jmpまたはpush、ret.