C++:contst static DEBUG 和 if 语句,实际的执行时间开销是多少
C++: contst static DEBUG and if statements, what is the actual execution-time overhead?
在学校里,我经常被教导预处理器语句很容易失控,因为你定义的字符串,例如:
#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
语句永远不会成为现实(如果我没记错的话)。
给出硬保证:这取决于每个编译器如何处理你提供给它的代码。
但是,任何实际的编译器都会为您优化这一点。它是现有最简单、最琐碎的优化之一,即使您禁用优化,大多数编译器也可能会这样做。
为本质上if (true)
的东西生成代码是没有意义的。
因此,运行时的开销应该为零。
标准中没有任何内容说编译器不能完全省略一段代码,如果它可以静态地(在编译时)确定它永远不会运行。
另一方面,标准中也没有说编译器必须进行优化(在一般情况下)。
因此,如果您为编译器提供足够的信息,并打开其优化功能,则很有可能完全消除这些分支。但确定的唯一方法是查看生成的代码。
对于像这样的"琐碎"调试启用代码,大多数现代编译器在大多数情况下都会完全消除死块。
在学校里,我经常被教导预处理器语句很容易失控,因为你定义的字符串,例如:
#define PI 3.1415926
在代码中的每个位置都被替换,当变量名称包含字符串 PI 时会导致奇怪的替换
不,PI
只替换整个单词(令牌)PI
,而不是在另一个令牌内。 例如 myPI
不会扩展PI
.
这是一个细节,但由于 DEBUG 现在是常量布尔值,你应该用小写字母来写它:
const static bool debug = true;
大写名称保留给预处理器宏。
- 简单C++"Hello World"程序的执行时间长
- 我使用 OpenMP 的线程越多,执行时间就越长,这是怎么回事?
- 为什么切换 for 循环的顺序会显著改变执行时间?
- cmd.exe与Powershell中C++程序的不同执行时间
- pthread执行时间比顺序执行时间差
- OpenCV 函数 cv::remap() 的执行时间更长,当程序在两者之间进入睡眠状态时
- 为什么 std::chrono 在测量循环和编译器优化的并行 OpenMP 的执行时间时不起作用?
- 我需要帮助来缩短检索 SSL 证书的执行时间
- 如何测量cudaMalloc执行时间
- c++中的执行时间和检查流状态
- 为什么for循环中的异步不能提高执行时间
- 为什么 C++ openMP 程序执行时间更长
- 测量任何 Windows 可执行文件的内存使用情况和执行时间
- 需要减少我的C++代码的执行时间
- 如何在 ubuntu 上的 php 脚本中获取程序(c,c++,java,python,php)的执行时间和内存使用量?
- 在Qt中设置pixmap时的执行时间很奇怪
- 异步控制线程执行时间
- 如何对 g++ 设置执行时间限制?
- C++:contst static DEBUG 和 if 语句,实际的执行时间开销是多少
- 编译器修剪循环的执行和时间开销?