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

问题描述 投票:0回答:1

这是一个简单的程序:

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
就可以完成这项工作。我之所以问这个,是因为我有一种感觉,其他编译器以类似的方式执行此操作(当然取决于底层硬件架构)。

c++ c compilation function-call
1个回答
6
投票

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

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

尝试将 func 设为 static 并查看是否有任何变化。

© www.soinside.com 2019 - 2024. All rights reserved.