【问题标题】:how does visual studio debug optimization work?Visual Studio 调试优化如何工作?
【发布时间】:2020-07-03 02:26:36
【问题描述】:

我试图在互联网上找到答案,但我找不到任何答案。

我在这里想说的是,在 Visual Studio 中,项目属性中有一个名为优化的选项,默认设置为在发布模式下启用,在调试模式下禁用。这个选项到底是做什么的?我的意思是它显然使程序运行得更快但是如何?幕后发生了什么?

我是一个不错的程序员,但是给我一个复杂的答案完全没问题,我可以以此为起点做更多的研究

【问题讨论】:

  • C++ 有一个as-if 规则:只要可观察到的结果相同,编译器就可以做任何事情。编译器究竟做了什么——这完全取决于那个编译器,你需要阅读那个编译器的文档。如果你想了解一般的优化,我想互联网上应该有很多资源,这个主题不是 C++ 独有的。
  • 调试模式优先考虑能够使用附加的调试器逐行(甚至逐个表达式)执行。发布模式优先级很快。您也许可以将调试器附加到发布模式代码,但要了解发生了什么、何时发生要困难得多。
  • 有关编译器优化的概述,您可以从 this Wikipedia article 开始。

标签: c++ visual-studio optimization


【解决方案1】:

优化是一种编译器功能,它试图分析程序并将其更改为更快(或有时更小)。

当优化关闭时,编译器会为您输入的内容创建汇编代码。当它打开时,它会改变它。这通常会使调试器感到困惑并且需要更长的时间来编译,但代码运行得更快。

例子:

#include <stdlib.h>

int main()
{
    int arr[10];
    for(int x = 0; x < 10; x++)
    {
        arr[x] = rand();
    }
}

如果不进行优化,arr[x] = 将:从内存中获取x 的值,乘以4,加上arr 的地址,然后将值存储在那里。

通过优化,编译器会注意到它可以在每次循环运行时向地址添加 4 - 它会将您的代码更改为:

#include <stdlib.h>

int main()
{
    int arr[10];
    int *current = arr;
    for(int x = 0; x < 10; x++)
    {
        *current = rand();
        current++;
    }
}

此外,它不会在每次需要时从内存中加载currentx,并在每次更改时将它们保存到内存中——它将选择一个寄存器来保存current 的值,一个寄存器来保存x 的值,并将它们保留在这些寄存器中。它可能根本不需要任何内存。

使用调试器可能会更难,因为如果您在程序运行时暂停current++;,它将无法向您显示程序正在做什么,因为该指令不在源代码中! (很可能,它会指向arr[x] = rand() 行,或者i++ 行)

如果编译器真的想要这样做,它可能甚至会决定由于循环总是恰好运行 10 次,它就可以这样做:

#include <stdlib.h>

int main()
{
    int arr[10];
    arr[0] = rand();
    arr[1] = rand();
    arr[2] = rand();
    arr[3] = rand();
    arr[4] = rand();
    arr[5] = rand();
    arr[6] = rand();
    arr[7] = rand();
    arr[8] = rand();
    arr[9] = rand();
}

现在没有x 变量,也没有循环。不过,代码更长。

其实,等一下,我们为什么要生成这些我们不需要的值?没有人关心arr 中的值是什么。所以它可以这样做:

#include <stdlib.h>

int main()
{
    rand();
    rand();
    rand();
    rand();
    rand();
    rand();
    rand();
    rand();
    rand();
    rand();
}

... 但是它不能删除rand() 调用,因为它不知道rand() 函数是否有任何重要作用。但是它确实知道你没有使用它的返回值,所以没有必要将它保存在任何地方。

这就是优化的意义所在。编译器重新排列程序以尝试使其更快。我刚刚向您展示了一些简单的优化,但它们可能比这更棘手。

【讨论】:

  • 原来它比我想象的要简单,谢谢,我还发现这个视频非常简单地介绍了优化的工作原理:youtube.com/watch?v=-nr8FnzgfYw
猜你喜欢
  • 2012-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多