register 告訴編譯器:「盡可能將此變數放在 CPU 暫存器中」,以避免記憶體存取延遲。但這只是「建議」,編譯器可視暫存器可用性決定是否採納。現代編譯器優化器極其強大,通常比程式設計師更懂何時該用暫存器,故手動加 register 多無必要。
#include
int main() {
register int i; // 請求放入暫存器
int tmp = 0;
for (i = 1; i < 10; i++)
tmp += i;
printf("The sum is %d\n", tmp);
return 0;
}
| 特性 | 說明 |
|---|---|
| 適用對象 | 頻繁存取的標量變數 (迴圈計數器、暫存累加器、旗標) |
| 不可取址 | 不能對 register 變數使用 & 運算子,因暫存器無記憶體位址 |
| 大小限制 | 通常限整數、指標、小型結構體 (視架構暫存器寬度而定) |
| 編譯器自主權 | 優化等級 -O2/-O3 時編譯器會自動決定,忽略 register 提示 |
-O2 以上會積極將熱點變數分配到暫存器,無需 程式設計師干預register 關鍵字通常發出警告或直接忽略register 已被棄用 (C++17 移除),C 標準保留但不鼓勵使用register 是 C 語言早期為了在有限暫存器資源下榨乾效能而設計的關鍵字。現代編譯器優化能力遠超人工微調,寫乾淨、語意清晰的代碼,配合高優化等級編譯,才是正道。理解其歷史背景與限制,比會用它更重要。