【发布时间】:2014-10-07 23:01:31
【问题描述】:
这是一个简单的程序:
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 就可以完成这项工作。我问这个是因为我觉得其他编译器以类似的方式执行它(当然取决于底层硬件架构)。
谢谢
【问题讨论】:
-
this 相关吗?
-
我不知道答案,但是
"%p":printf("%p", (void *)func);必须有演员表 -
@AlterMann:你说得对,“%p”是用于对象指针而不是函数指针。但是,您的建议也会导致未定义的行为。请参阅stackoverflow.com/questions/2741683/… 的已接受答案
-
@KlasLindbäck,真的!
-
@quantdev:谢谢!您的链接指向stackoverflow.com/q/2485336/1382251,而后者又指向msdn.microsoft.com/en-us/library/4khtbfyf%28VS.80%29.aspx,那里有一些很好的解释,说明如何将其从两条指令更改为一条指令(如果我理解正确的话)......会试一试。 ..
标签: c++ c compiler-construction compilation function-call