在大多數情況下,如果我想創建C中的可選功能,我只需創建兩個函數是這樣的:爲什麼GCC保留空功能?
#ifdef OPTIONAL_SOMETHING
void do_something(int n, const char *s)
{
while (n--) {
printf("%s", s);
}
/* ...You might get the point, really do something... */
}
#else
void do_something(int n, const char *s)
{
/* Empty body */
}
#endif
因此,如果符號未定義 - 當功能被禁用 - 一個空函數被編譯成可執行文件。
鑽研組裝上市,似乎GCC編譯並呼籲空函數時的優化是禁用。如果啓用優化,也與-O2
和-O3
,只編譯必要的堆棧處理代碼,但它優化了調用指令。總而言之,它保持了這個功能。
大約同樣適用於非空的,但未使用的方法。
它應該簡單地扔掉整個事情,但事實並非如此。爲什麼這是默認行爲?只是爲了好奇:我如何消除這種情況?
「如果啓用優化,同樣使用-O2和-O3,它僅編譯必要的堆棧處理代碼,但它優化了調用指令。」這是否意味着這樣還有一些開銷? 'start_timer(); do_something(); stop_timer();'需要比'start_timer(); stop_timer();'更長的時間? – 2013-10-28 14:26:38