Release对Debug版本的优化
先来给大家看一道题
想想这个题的答案是多少,先不要看后面的解析
#include <stdio.h>
int main()
{
int i = 0;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
for(i=0; i<=12; i++)
{
arr[i] = 0;
printf("hehe\n");
}
return 0;
}
答案是无限循环
解析:
首先内存是分为三个区的:栈区,堆区,静态区
代码中的 i 和 arr 是局部变量,因为局部变量是放在栈区上的,
栈区的使用习惯是先使用高地址再使用低地址
又因为数组随着下标的增长,地址是由底到高变化的
随着数组下标的不断增长,它就会访问到 i 的地址,访问到 i 的地址为12的时候,arr[ 12 ] = 0,又把 i 改成了 0 ,当 i 再次进行循环判断时 0<12,所以这里会死循环。
在不同编译器中局部变量的间隔有可能会不同,我使用的编译器是Visual Studio 2019,这个编译器正好是间隔两个地址
但是在Release版本中这段代码只会循环12次
这是又是为什么呢?看下面这张图就很好理解了
这里我们发现 i 的地址比 arr 低,变量在内存中开辟的顺序发生了变化,影响到了程序执行的结果。
使用循环12次就是因为Release版本优化导致的。