0

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.

4

0 に答える 0