1
2
我只能猜测,但我很确定您正在检查调试版本。
在调试模式下,MSVC++编译器通过调用跳转存根来替换所有调用。这意味着,每个函数都从跳转到实际函数开始,这正是您所面对的。
编辑: 这实际上受链接器设置/增量的影响。您描述的效果没有出现在发布版本中的原因是,如果启用了任何类型的优化(当然,通常是发布版本的情况),这些跳转存根都会被简单地优化掉。 |
2
2
你想要的演员:
在Project & Gt中,将调试信息格式从“程序数据库编辑和继续(/ZI)”切换到“程序数据库(/ZI)”。我相信正是这种设置导致编译器插入跳转代码,以便调试器可以在程序运行时重建函数并对其进行热修补。也可能关闭“启用最小重建”。 在MSVC中检查代码的一种更简单的方法是简单地设置一个断点并检查反汇编(右键单击行并从弹出菜单中选择“转到反汇编”)。它用源代码对反汇编进行注释,这样您就可以看到每一行被编译成什么。 |
3
1
如果您想查看给定编译函数的程序集和机器代码,那么向编译器提供/facs命令行选项并查看随后的.asm文件会更容易。 我不确定定义的行为是什么,用于将函数指针强制转换为字节流——它甚至可能无法正常工作——但另一个可能的困惑是,x86函数的大小都是可变的,而且其结尾也很小。 |
4
1
如果这是在启用增量链接的情况下,那么您看到的是
|
Lukas Eder · 如何使用调试日志信息动态生成堆栈帧 8 年前 |
Valentin Lorentz · Python 3字节码格式 8 年前 |
batman · Java中何时执行二进制运算符? 9 年前 |