C++:constst static DEBUG 和 if 语句,实际执行时间开销是多少?

问题描述 投票:0回答:4

在学校,我经常被告知预处理器语句很容易变得混乱,因为您定义的字符串,例如:

#define PI 3.1415926

在代码中的每个位置都被替换,当变量名称包含字符串

PI
时,会导致奇怪的替换。

因此,在调试时,我避免使用以下方法:

#define _DEBUG
...
#ifdef _DEBUG
    // debug code
#endif
...

但我认为使用起来会“更安全”:

const static bool DEBUG = true
int main()
{
    ...
    if(DEBUG){ /* debug code*/ }
    ...
}

这效果很好,但我想知道与预处理器语句方法相比,这种方法在运行时的开销是什么?使用预处理器方法,一切都发生在编译之前,因此不会产生运行时开销。 我知道一个简单的

if

语句的开销几乎可以忽略不计,但是当它深入到一些运行大量次的嵌套循环中时,这并不成立(小事加起来就是大事)的东西)。


编译器是否认识到

DEBUG

const static
并将其
硬编码
到可执行文件中,已经在编译时启用或禁用调试代码?让我怀疑的是,有一天,当处理一些不相关的代码时,编译器警告我代码的某些部分已过时,因为围绕它的 if 语句永远不会成为真(如果我没记错的话)。
    

c++ debugging
4个回答
3
投票

但是,任何现实世界的编译器都会为您优化这一点。这是现有的最简单、最琐碎的优化之一,即使您禁用优化,大多数编译器也可能会这样做。

为本质上的内容生成代码是没有意义的

if (true)


因此运行时的开销应该为零。


3
投票

另一方面,标准中也没有任何内容表明编译器

必须

进行优化(在一般情况下)。 因此,如果您为编译器提供足够的信息,并打开其优化功能,它很可能会完全消除这些分支。但唯一确定的方法是查看生成的代码。

对于像这样的“琐碎”调试启用代码,大多数现代编译器在大多数情况下都会完全消除死块。


1
投票
在学校,我经常被告知预处理器语句很容易变得混乱,因为您定义的字符串,例如:

#定义 PI 3.1415926

在代码中的每个位置都被替换,当变量名称包含字符串 PI 时,会导致奇怪的替换

不,
PI

仅替换整个单词(标记)

PI
,而不是另一个标记内。例如。
myPI
不展开
PI
    


0
投票

const static bool debug = true;

大写名称保留给预处理器宏。

© www.soinside.com 2019 - 2024. All rights reserved.