這裏是我的測試代碼:爲什麼GCC沒有將這個'printf'優化爲'puts'?
#include<stdio.h>
static inline void foo(int a){
printf("%x\n", a);
}
int main(void){
foo(0x1234);
return 0;
}
我想GCC應該認識到,a
是一個文字整數,優化像這樣的代碼:
puts("1234");
,但我得到了下面的彙編代碼:
│0x8048341 <main+17> push $0x1234
│0x8048346 <main+22> push $0x80484e0
│0x804834b <main+27> push $0x1
│0x804834d <main+29> call 0x8048310 <[email protected]>
我的項目中存在很多這樣的代碼,因爲我一直認爲GCC會爲我優化,甚至在某些情況下可以簡單使用'write()'的文本,我堅持使用printf
,因爲我認爲我會從緩衝機制中獲益。
現在我覺得很後悔,對削減格式字符串會殺死任何增益我的開銷。我的項目中的這些代碼相當低級,可能會導致性能瓶頸。
[過早優化是萬惡之源](http://c2.com/cgi/wiki?PrematureOptimization) – Barmar
你有沒有*測量過*的表現? – Caleth
依靠編譯器神奇地爲你優化的東西通常是一個絕望的做法。 – VTT