Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 如何在Visual Studio中查看优化速度生成的反汇编_Visual Studio_Visual Studio 2010_Assembly_Visual C++_Visual Studio 2015 - Fatal编程技术网

Visual studio 如何在Visual Studio中查看优化速度生成的反汇编

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”) 在“代码生成->基本

我在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