Visual Studio 调试优化如何工作?

how does visual studio debug optimization work?

本文关键字:工作 何工作 Studio 调试 优化 Visual      更新时间:2023-10-16

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

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

我是一个体面的程序员,但给我一个复杂的答案是完全可以的,我可以把它作为一个起点做更多的研究

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

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

例:

#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()函数是否执行任何重要操作。但它确实知道您没有使用它的返回值,因此将其保存在任何地方都没有意义。

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