Debug / release模式
Debug模式下的代码比release模式具有更多的检测,比如在windows平台上assert宏只在release模式下有效。Linux上则没有这个限制,无论Debug还是release模式assert都生效,但是如果你想让assert失效,编译的时候 加上 -DNDEBUG 即可。
Debug检测
我们都说了Debug模式可以帮我们检测一些东西,但是可能会有额外的性能开销(虽然微不足道)。默认下Linux的动态库文件是集于Debug 和 release于一身的。看看这个列子
#include<vector>
using namespace std;
int main()
{
vector<int> v;
v.reserve(10); //容量为10 但是size 为0
v[3] = 1;
return 0;
}
下面这份代码在windows 下的Debug模式下会崩溃,release模式下不会崩溃,这是因为windows下的vector对operator[] 做了assert的检测。那么我们跑这份代码在Linux下,它并不会报错,所以那我们如何开启真真的Debug 模式呢?
GCC 的 Debug模式
_GLIBCXX_DEBUG
如果我们想开启Debug模式必须定义上面的宏
debug模式下的容器
gcc是有专门的debug容器的,这些容器使用起来和标准容器一模一样,所以放心使用就好,但是有个准则就是俩个不同的.o文件内不能一个使用了debug模式的容器,一个没使用debug模式下的容器,这俩个.o文件是不能链接到一起的。
非c++11的

c++11的Debug容器

demo
1 #include<debug/vector>
2 #define _GLIBCXX_DEBUG
3
4 int main()
5 {
6 __gnu_debug::vector<int> v;
7 v.reserve(10);
8 v[3]=1;
9 return 0;
10 }
[yutian@~]$ ./a.out
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/debug/vector:265:
error: attempt to subscript container with out-of-bounds index 3, but
container only holds 0 elements.
Objects involved in the operation:
sequence "this" @ 0x0x7ffeae481db0 {
type = NSt7__debug6vectorIiSaIiEEE;
}
Aborted (core dumped)
Debug模式在GCC/G++中提供了更多的代码检测,但可能带来轻微的性能开销。在Linux下,动态库默认同时支持Debug和release。为了启用Debug模式,需要定义_GLIBCXX_DEBUG宏,并注意不同.o文件的Debug容器一致性。GCC提供了与标准容器行为一致的Debug容器,适用于C++11之前和之后的版本。
4766

被折叠的 条评论
为什么被折叠?



