优化是一种编译器功能,它试图分析程序并将其更改为更快(或有时更小)。
当优化关闭时,编译器会为您输入的内容创建汇编代码。当它打开时,它会改变它。这通常会使调试器感到困惑并且需要更长的时间来编译,但代码运行得更快。
例子:
#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() 函数是否有任何重要作用。但是它确实知道你没有使用它的返回值,所以没有必要将它保存在任何地方。
这就是优化的意义所在。编译器重新排列程序以尝试使其更快。我刚刚向您展示了一些简单的优化,但它们可能比这更棘手。