当我阅读 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。