2011-06-12 79 views
6

对于调试,我有很多调用我的应用程序中的调试日志功能。当然,在生产版本中,这些调试调用需要被跳过。而是写:调试和预处理指令

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

绕到调试功能,我决定所有调用写在调试功能本身如下:

#if DEVEL != 1 
    return; 
#endif 

将无用的函数调用的开销由编译器来避免或者我为了性能的原因使用(许多丑陋的)#if #endif构建更好?

回答

7

而是担心优化的,你可以做一个简单的一招:

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

现在使用LOG_DEBUG处处保持简单。

+0

不错。但是,为什么#else版本没有参数? – 2011-06-12 11:35:59

+0

@Kerrek,因为只有2个条件。如果它不是'DEVEL == 1',那么它肯定会是'DEVEL!= 1'。 – iammilind 2011-06-13 03:31:44

+0

没有抱歉,我的意思是为什么LOG_DEBUG的第一个版本有参数(括号),但第二个版本没有?如果你写了'LOG_DEBUG(“hello”)',那么第二个宏就会扩展到'“hello”',而不是什么? – 2011-06-13 09:15:54

5

如果函数可用于内联(例如,它在头中实现),那么优化器将毫无困难地摆脱函数调用,从而使您没有开销。

+1

即使没有在头文件中定义该调用,该调用很可能会通过链接时优化来删除。 – Timo 2011-06-12 07:45:03

+0

@Timo,因此“* eg *” – Motti 2011-06-12 08:01:27

+0

更好的是在编译时删除,所以调用不会影响寄存器分配或序言/收尾对于叶子和非叶子调用函数 – 2011-06-12 22:38:07

2

你为什么不检查?

使用gcc只需编译-S,并看看输出。

+0

并打开优化器: - O或-O3 – 2011-06-12 22:39:09