2013-10-21 94 views
2

我注意到GCC對優化printf非常聰明。例如,printf("")已從完成的代碼中完全刪除。 printf("\n")被替換爲putchar('\n')GCC printf優化

我注意到當我編譯一個很小的模塊,像這樣:

extern "C" int printf(const char *__restrict __format, ...); 

void f() 
{ 
    printf("\n"); 
} 

gcc -O2printf呼叫被替換putchar('\n')(甚至不需要包括任何頭文件)。

生成的代碼:

f(): 
     mov  edi, 10 
     jmp  putchar 

什麼是要執行的,可以讓這些優化的機制?據我所知,標準C++沒有提供任何允許這種優化的功能。

是否可以擴展用戶功能,或者在編譯器中「硬編碼」?

這也意味着如果我想用自己的實現重新定義printf,編譯器可能會搞砸了。這是真的嗎?

回答

0

使用GCC進行編譯時,某些函數是內置函數。這意味着它們的實現內置於編譯器中,並且庫版本被忽略。 printf就是這樣一個功能。

看看http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html

+0

感謝您的鏈接。不幸的是,它沒有描述可能發生的所有可能的優化。只是列出了功能。 – detunized

+1

一旦一個函數在編譯器中,編譯器就可以自由地提供任何代碼替換,它們表現出相同的行爲。在printf的情況下,它可以檢查格式字符串並相應地生成代碼。庫函數不能做到這一點。 – doron