C 語言離不開函數,模組化帶來的代價是函數調用開銷:參數壓棧、返回地址保存、棧幀建立/銷毀、跳轉指令等。在高頻調用(如億級循環)場景下,這部分開銷顯著。
#include <stdio.h>
#include <time.h>
int sum(int x) { return x + x; }
int main(void) {
int count = 1000000000; // 10億次
int i, num;
time_t start, stop;
time(&start);
for (i = 0; i < count; i++) num = sum(i);
time(&stop);
printf("調用函數用時: %d 秒;\n", stop - start); // 約 8 秒
time(&start);
for (i = 0; i < count; i++) num = i + i;
time(&stop);
printf("非函數用時: %d 秒;\n", stop - start); // 約 4 秒
getchar();
return 0;
}
結果:函數版耗時約 2 倍於直接運算,驗證了調用開銷的真實存在。
inline 優化在函數定義前加 inline 關鍵字,請求編譯器將函數體內嵌到調用點,消除調用開銷,類似宏展開但具備類型安全。
inline int sum(int x) { return x + x; }
int main(void) {
// 同樣測試邏輯...
// 結果:多次測試基本仍為 8 秒 / 4 秒
// 結論:C++Builder 2009 未採納 inline 請求
}
inline 函數必須在使用它的編譯單元中定義(通常放在頭文件),而非僅聲明。inline 行為與 C++ 略有不同,C99 需在一個源文件提供非內聯定義作為外部鏈接備用。-O2/-O3 下會自動內聯小函數,無需手動 inline。__attribute__((always_inline)) (GCC/Clang) 或 __forceinline (MSVC) 可強制內聯。-flto)可跨編譯單元內聯。-O2)。inline 輔助編譯器決策。inline 或宏可能帶來明顯收益。函數調用確有開銷(實測 2 倍差距),inline 是消除開銷的標準手段,但現代編譯器在優化開啟時極其激進,手動干預往往多餘。理解底層機制、善用分析工具、信任編譯器,是高效能 C 開發的正確心法。