调试和预处理指令

6

为了调试,我在我的应用程序中有许多调用调试日志函数的代码。当然,在生产版本中,这些调试调用需要被跳过。不要写成:

#if DEVEL == 1
    Log::debug(...);
#endif

在调用debug函数时,我决定在debug函数本身中编写以下内容:

#if DEVEL != 1
    return;
#endif

编译器是否会避免无用函数调用的开销,还是出于性能考虑最好使用(很多丑陋的)#if #endif结构?

3个回答

7

不必担心优化器,你可以使用一个简单的技巧:

#if DEVEL == 1
#define LOG_DEBUG(...) Log::Debug(__VA_ARGS__)  // variadic macro
#else
#define LOG_DEBUG
#endif

现在,为了简单起见,请在所有地方使用LOG_DEBUG

不错。但是为什么 #else 版本不带参数呢? - Kerrek SB
@Kerrek,因为只有两种情况。如果不是DEVEL == 1,那么肯定是DEVEL != 1 - iammilind
不好意思,我的意思是为什么LOG_DEBUG的第一个版本有参数(括号),但第二个版本没有?如果你写LOG_DEBUG("hello"),那么第二个宏会扩展为"hello",而不是空的,对吧? - Kerrek SB
不管参数如何,在第二种情况下,LOG_DEBUG 都将被替换为空。 - c-urchin

5
如果函数可以内联(例如,它在头文件中实现),那么优化器将没有问题摆脱函数调用,从而使您不会有任何开销。

1
即使在头文件中没有定义,该调用很有可能会被链接时优化删除。 - Timo
最好在编译时删除,这样调用就不会影响叶子函数和非叶子函数的寄存器分配或前/后奏。 - Paul Beusterien

2

为什么不自己检查一下呢?

使用gcc编译命令时,只需添加-S选项,查看输出结果即可。


打开优化器:-O 或 -O3 - Paul Beusterien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接