Visual studio 如何在Visual Studio中查看优化速度生成的反汇编
我在VisualStudio中有一个C程序,我想在其中比较标准调试构建和速度优化的构建之间的反汇编 为了使标准调试工作能够完美地进行,我设置了一个断点,然后右键单击“Goto Disassembly”以查看等效的汇编代码 但是,当我尝试在启用“速度优化”开关时执行此操作时,我只看到部件的一部分 我创建优化速度构建的过程是(停留在调试构建配置中):Visual studio 如何在Visual Studio中查看优化速度生成的反汇编,visual-studio,visual-studio-2010,assembly,visual-c++,visual-studio-2015,Visual Studio,Visual Studio 2010,Assembly,Visual C++,Visual Studio 2015,我在VisualStudio中有一个C程序,我想在其中比较标准调试构建和速度优化的构建之间的反汇编 为了使标准调试工作能够完美地进行,我设置了一个断点,然后右键单击“Goto Disassembly”以查看等效的汇编代码 但是,当我尝试在启用“速度优化”开关时执行此操作时,我只看到部件的一部分 我创建优化速度构建的过程是(停留在调试构建配置中): 从项目属性->C/C++->优化将优化从禁用/Od更改为最大化速度/O2的优化,并将偏好大小或速度更改为“偏好快速代码/Ot”) 在“代码生成->基本
#include<stdio.h>
int main()
{
int x = 0;
int y = 0;
printf("The value of x is %d\n", x);
while (1)
{
++x;
if (x > 1000000)
break;
}
y = x;
printf("The value of y is %d\n", y);
return 0;
}
这是优化速度构建的反汇编-注意while循环例程没有显示任何代码
int x = 0;
int y = 0;
printf("The value of x is %d\n", x);
00EE16F0 push 0
00EE16F2 push offset string "The value of x is %d\n" (0EE6B30h)
00EE16F7 call _printf (0EE1320h)
while (1)
{
++x;
if (x > 1000000)
break;
}
y = x;
printf("The value of y is %d\n", y);
00EE16FC push 0F4241h
00EE1701 push offset string "The value of y is %d\n" (0EE6BE8h)
00EE1706 call _printf (0EE1320h)
00EE170B add esp,10h
return 0;
00EE170E xor eax,eax
}
00EE1710 ret
两个生成在printf语句中为x和y输出相同的值。
有人知道如何解决我的问题吗?这是完全正常的,删除不必要的代码是优化器的工作。它可以很容易地告诉你,while循环是没有意义的,x的最终值总是1000001。这就是push 0F424H指令的作用。机器中的优化器并不能完全替代程序员耳中的优化器,但它试图接近。@HansPassant-那么你是说优化器跳过while循环并执行x=1000001的等式?@HansPassant-我相信你是对的。我只是让我的while循环变得更加复杂,现在我在程序集中也看到了熟悉的无限代码。“两个构建都在printf语句中为x和y输出相同的值。”:没错,这就是您在外部可以“看到”的所有内容,所以这就是优化器留下的全部内容。无法删除诸如操纵文件、调用设备驱动程序、系统服务等内容,因为应用程序的行为会有所不同。优化器可以更改任何类似内部计算的内容。有时会出现一些灰色区域,如f.e.将常数划分为乘法,结果可能略有不同,但这些优化通常需要启用额外的优化器标志。
int x = 0;
int y = 0;
printf("The value of x is %d\n", x);
00EE16F0 push 0
00EE16F2 push offset string "The value of x is %d\n" (0EE6B30h)
00EE16F7 call _printf (0EE1320h)
while (1)
{
++x;
if (x > 1000000)
break;
}
y = x;
printf("The value of y is %d\n", y);
00EE16FC push 0F4241h
00EE1701 push offset string "The value of y is %d\n" (0EE6BE8h)
00EE1706 call _printf (0EE1320h)
00EE170B add esp,10h
return 0;
00EE170E xor eax,eax
}
00EE1710 ret