可以这么说:release版本取掉了debug信息,进行了优化。
举个例子:那断言----Assertion来说,很多库函数本身的实现代码里,包含了很多的断言。通过ASSERT宏来声明这些断言,这个宏只有在程序 的debug版里才有效。而在release版里它完全被忽略, 为的也就是减少系统的消耗, 至于debug版本运行结果正确,可release版却出错,可能的问题也就在这些断言里,特别是自己写的断言。
比如ASSERT(***) 这***里不光是判断,如果还有其他创建之类的操作,到了release版,被忽略后,也就容易带来问题。 举个例子: int a; debug时a值恒定,总为cdcdcdcd release时a值不定,为当时内存值 这时你在使用a时就会引起结果的不一致,甚至导致溢出!所以对变量初始化尤其是对指针,数组变量初始化是一个良好的习惯! debug与release的不同大多是因为程序代码写的不规范,不严谨而造成的。
关于Debug和Release之本质区别的讨论~~(主要针对VC6.0和VS2003.net编译工具而言)
一、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
Debug
Release