一.首先是关于Debug 和 Rlease的介绍
Debug通常为调试版本 它包含调试信息 并且不做任何优化 便于程序员调试程序
Release称为发布版本 它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好的使用
test.c -> .exe 可执行程序
Debug -> Debug版本的可执行程序 可以调试的,因为文件中包含了调试信息
Release -> Release版本的可执行程序 不能进行调试
既然知道了Release版本会对Debug版本进行了一些优化
那么Release版本相对于Debug版本进行了那些优化呢?
下面有一个例子能够很好的介绍
Debug版本下面代码为死循环
Release版本下面代码打印13行hehe
int main()
{
int i = 0;
int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
for (i = 0; i <= 12; i++)
{
printf("hehe\n");
arr[i] = 0;
}
system("pause");
return 0;
}
分析死循环原因 :
1.main函数中i和数组arr都是局部变量,局部变量是在栈上存储的,而栈区默认先使用高地址处的空间,再使用低地址的空间,并且数组随着下标增长,地址是由低到高变化
2.当出现越界访问数组时,就有可能越界访问到i的地址,然后改变数组的时候,将i改变,从而导致死循环
int main()
{
int i = 0;//由于上面的原因 如果改变定义i和数组arr的顺序就不会出现死循环 但是仍会报错 不建议越界
int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//VC6.0 环境下 <= 10 就死循环 说明内存布局空间不同
//gcc 编译器 <= 11 就死循环
//VS2013 <= 12 就死循环
printf("%p\n", arr);//Debug版本i的地址高于数组arr地址 Release版本优化之后数组arr地址高于i的地址
printf("%p\n", &i);
//for (i = 0; i <= 11; i++)
//{
// printf("hehe\n");
// arr[i] = 0;
//}
system("pause");
return 0;
}
二.学会快捷键
F5 启动调试,经常用来直接调到下一个断点处(执行逻辑的下一个断点)。 要和F9配合使用
F9 创建断点和取消断点 断点的重要作用,可以在程序的任意位置设置断点。这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。 设置断点
F10 逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。
F11 逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部(这是最常用的)。
CTRL + F5 开始执行不调试,如果你想让你的程序直接运行起来而不调试就可以直接使用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)