register 修飾符建議編譯器將變數儲存在 CPU 暫存器而非記憶體中,以加快存取速度。典型應用場景:
memcpy(char *d, char *s, int i) {
register char *d; // 建議放入暫存器
register char *s;
register int i;
while (i--) *d++ = *s++;
}
&var 編譯錯誤,因暫存器無記憶體位址。早期編譯器(1980s~1990s)確實依賴 register 提示。但現代優化器(GCC、Clang、MSVC、LLVM)擁有強大的暫存器分配演算法(圖著色、線性掃描等),能自動分析變數存活期、使用頻率、干涉關係,做出比人工提示更優的決策。因此:
register 關鍵字。register int i; 在現代編譯器下等同於 int i;,僅多一個「不可取址」的編譯期檢查。// test.c
void foo() {
register int a = 0;
// &a; // 取消註解會編譯錯誤
for (int i = 0; i < 100; i++) a += i;
}
編譯 gcc -O2 -S test.c 查看組合碼,a 與普通區域變數無差異,均由優化器決定是否駐留暫存器。
register 作為文檔與編譯期約束。register 是 C 語言演進歷史的見證:從程式員手動微優化,到編譯器自動優化接管。保留它僅為相容舊碼與提供「不可取址」語意。在現代開發中,將優化交給編譯器,專注於架構層面的效能設計,才是正道。