Visual Studio 调试优化如何工作?
how does visual studio debug optimization work?
我试图在互联网上找到答案,但我找不到。
我想说的是,在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++;
}
}
此外,它不会在每次需要它们时从内存中加载current
和x
,并在每次更改时将它们保存到内存中 - 它将选择一个寄存器来保存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()
函数是否执行任何重要操作。但它确实知道您没有使用它的返回值,因此将其保存在任何地方都没有意义。
这就是优化的意义所在。编译器重新排列程序以尝试使其更快。我刚刚向您展示了一些简单的优化,但它们可能比这更棘手。
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?
- sdl软件渲染器不工作,工作在硬件加速的一个