Debug和Release版本之间可能出现的差异?

时间:2012-05-21 15:29:00

标签: c++

我今天在一次采访中被问到列出了在调试和发布版本之间可能发生的四个差异。我认为它们意味着行为的差异,而不是诸如调试信息和诸如此类的差异。我只能说出两个名字:

  1. 由于某些函数没有内联,调试版本通常要慢得多。
  2. 由于速度不同,在具有竞争条件的多线程程序中,这些竞争条件可能仅在两个版本中的一个中变得明显。
  3. 我可以命名哪些其他差异?

3 个答案:

答案 0 :(得分:7)

以下是一些差异的摘要:http://msdn.microsoft.com/en-us/library/aa236698%28v=vs.60%29.aspx。它包括:

  • 堆布局(使用调试内存分配器)
  • 宏(包括断言语句,以及“#ifndef NDEBUG”中包含的任何内容,在某些情况下可能会有很大差异 - 例如,我知道在调试模式下编译时,某些boost库会为结构添加额外的字段,可以用来进行健全性检查)
  • 优化(主要在调试版本中禁用)
  • 初始化&坏指针:未初始化的变量在分配给它们之前有未定义的状态;但是在调试版本中,它们通常会初始化为某个已知状态(例如全部为零或全部为#CCCCCCC等)。

答案 1 :(得分:3)

除了你的两个答案之外,还有另外四个答案:

  1. _DEBUG vs NDEBUG
  2. 链接器在调试和发布期间使用不同的库
  3. 调试版本还会生成用于调试的符号
  4. 代码可以最终被优化掉,因此,在某些情况下,您可能会在发布期间减少对某些构造函数的调用,这可能会导致一些令人讨厌的错误。这是一个例子:
  5. Object x(3);
    Object y;
    y = x;
    

    Object x(3);
    Object y = x;
    

答案 2 :(得分:1)

另一点是许多库通过调试启用了额外的检查。这可能具有讽刺意味着代码在调试版本中工作,但在版本构建中没有:

想象一下,由于性能原因,分配函数会在调试版本中将内存清零,但不会在版本构建中清零。如果随后在未初始化的情况下读取此变量的值,则调试版本将看到明确定义的(零)值,而发布版本可以看到任何值。

相反,调试构建检查当然可以捕获未定义的行为,例如通过检查[]的访问权限是否在定义的范围内。