0

当我阅读 gcc 文档时,我认为 inline (或inline)关键字会消除函数调用开销。

正如我所说:“ GCC 实现这一点的一种方法是将函数的代码集成到其调用者的代码中。这通过消除函数调用开销来加快执行速度;此外,如果任何实际参数值是常量,它们的已知值可能允许在编译时进行简化,因此不需要包含所有内联函数的代码。” Gcc Manual 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