为什么VS2013将函数调用编译成两个指令而不是一个?

时间:2014-08-14 10:15:54

标签: c++ c compiler-construction compilation function-call

这是一个简单的程序:

void func()
{
    printf("hello");
}

int main()
{
    printf("%p",func);
    func();
    return 0;
}

踩到printf("%p",func)行,我在控制台上打印00F811AE

反汇编行func(),给我call _func (0F811AEh) - 到目前为止一直很好。

但是反汇编func的内容,第一条指令显示在地址00F813C0

所以我“去看”地址00F811AE上有什么,我发现jmp func (0F813C0h)

总结一下,似乎函数调用被编译为两个指令:

call _func (0F811AEh)
jmp   func (0F813C0h)

为什么VS2013编译器使用两条指令而不只是一条?

似乎只有一个jmp可以胜任这项工作。我甚至都在问这个问题,因为我觉得其他编译器也是这样做的(当然,取决于底层的硬件架构)。

由于

1 个答案:

答案 0 :(得分:6)

了解" thunking":http://en.wikipedia.org/wiki/Thunk

" thunking"在您的示例中,代码的其余部分将始终调用 func ,但执行相同角色的任何函数都可以注入到地址0x00F811AE的调用中。

尝试 func 静态,并查看是否有任何更改。