2011-06-12 109 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