🚩write in front🚩   

🔎大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎

🏅2021年度博客之星物联网与嵌入式开发TOP5~2021博客之星Top100~阿里云专家博主 & 阿里云星级博主~掘金⇿InfoQ~51CTOP创作者(创作新人榜No.38)~[CSDN]周榜102﹣总榜826 ⇿ 全网访问量35w+🏅

🆔本文由 謓泽 原创 发布在51CTOP 如需转载还请通知⚠

📝个人主页-​謓泽51Ctop的博客​📃

🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝

📣系列专栏-​謓泽51Ctop的分类_51CTO博客​🎓

✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本📩

【C语言】本质区别Debug和Release_#include

本质区别

Debug和Release编译方式的本质区别

Debug 通常称为调试版本,它包含调试信息并且不作任何优化,便于程序员​​调试程序​​。

Release 称为发布版本,它往往是进行了各种优化,使得程序在​​代码​​大小和运行速度上都是最优的,以便用户很好地使用。还有大小的区别,因为Debug的版本是可以进行调试的(包含了相应的调试信息),而Release版本是不能进行调试的。

Debug 和 Release 的真正秘密,在于一组编译选项。

下面列出了分别针对二者的选项

(当然除此之外还有其他一些,如/Fd /Fo,但区别并不重要,通常他们也不会引起 Release 版错误,在此不讨论)

Debug 版本:

/MDd /MLd 或 /MTd 使用 Debug runtime library(调试版本的运行时刻函数库)

/Od 关闭优化开关

/D "_DEBUG " 相当于 #define _DEBUG,打开编译调试代码开关(主要针对 assert函数)

/ZI 创建 Edit and continue(编辑继续)数据库,这样在调试过 程中如果修改了​​源代码​​不需重新编译 /GZ 可以帮助捕获内存错误

/Gm 打开最小化重链接开关,减少链接时间

Release 版本:

/MD /ML 或 /MT 使用发布版本的运行时刻函数库

/O1 或 /O2 优化开关,使程序最小或最快

/D "NDEBUG " 关闭​​条件编译​​调试代码开关(即不编译assert函数)

/GF 合并重复的字符串,并将​​字符串常量​​放到只读内存,防止 被修改

实际上,Debug 和 Release 并没有本质的界限,他们只是一组编译选项的集合,​​编译器​​只是按照预定的选项行动。事实上,我们甚至可以修改这些选项,从而得到优化过的调试版本或是带跟踪语句的发布版本。

  • 采用Debug的话,如果用Debug代码来编译可执行程序的话,我们也会产生一个Debug的版本的一个可执行程序
  • 采用Release的话,就是发布版本,可执行的程序。——(简化)

Release版本优化:

#include<stdio.h>
#include<stdlib.h>
int main(void){
int i = 0;
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
for(i=0;i<=12;i++)
{
printf("hello C\n");
arr[i] = 0;
}
system("pause");
}

【C语言】本质区别Debug和Release_编译器_02

大家可以分别试一下就会发现不同之处了,分别用Debug和Release运行以下程序。这里是当你for循环的结果为假的时候,它的i又会重置为0,然后一直这个样子重复循环打印for语句的循环内容。因为arr这里跟i它们两个人是同一块空间,那么当你改变arr[i]的时候int i也会改变。因为它们的地址是一样的,所以才会改变。

由于这个程序涉及范围到栈区一些相关的知识点的内容,在这里我跟大家简单的说下。

栈区:栈区的默认使用是先使用高地址处的空间,然后在使用低地址处的空间。数组的下标随着增长,地址是由低到高变化的。当然如果你在不同的编译器上运行它的死循环的位置可能不同。你们也可以在不同的编译器上运行一下对比一下