这几天翻了下笔记本,有好多知识没同步上来,写起!
它们无本质区别,只是在编译的时候多添加了一些编译选项。
DEBUG | Are |
---|---|
/mdd,mtd | c语言运行库(不讲了) |
/od | 关闭优化开关 |
/D | 给_DEBUG宏 |
/ZI | 创建edit continue数据库(就是修改源码不重新编译) |
/GI | 捕获内存错误 |
/GM | 打开最小化重链接开关,减少链接时间 |
RELEASE | Are |
---|---|
/mt,/md | |
/o1,/o2 | 优化开关,使程序最小或最快 |
/d | “NDEBUG宏” 关闭条件编译调试代码开关(即不编译assert函数) |
/gf | 合并重复字符串并放入只读内存 |
再来看下一个debug的现象
/rtcx(插入动态检测代码)这个编译选项有点意思
0XCC初始化所有的自动变量 。
所以会发现无论在栈控件只声明不定义会发现:int都是(-858993460)
char*一般都是0xccccccc,开辟个char数组会是:烫烫烫烫烫烫类型的####oxcd堆分配内存,0xdd填充delete内存,0xfd填充被保护内存
所以看到的堆new的数据:int永远是-842150451, char*:0xcdcdcdcd(屯屯屯屯屯屯屯)
还有一种情况,就是debug模式一般会保护new的内存,所以会向前后加0xfdfdfdfd保护内存防止越界访问(恰恰恰恰恰恰“麻蛋,金字旁的不会打,算了”)
最后说下俩个模式注意项