register 提示編譯器:「請將此變量存放在 CPU 寄存器中以加速訪問」。但這只是請求,不保證滿足——編譯器可根據寄存器資源情況自行決定。
| 規則 | 說明 |
|---|---|
| 僅限局部變量 | 全局/靜態變量不可用 register |
| 類型限制 | 必須是 CPU 寄存器能容納的類型(通常為 int、指針、小結構體) |
| 不可取址 | 禁止 & 操作符,因寄存器無內存地址 |
| 不可數組 | 數組名本質是地址,與寄存器存儲衝突 |
| 僅作請求 | 編譯器可能忽略,視為普通 auto 變量 |
void fast_loop() {
register int i; // 請求放入寄存器
for (i = 0; i < 1000000; i++) {
// 循環計數器頻繁訪問,適合寄存器
}
// 錯誤示範:
// register int arr[10]; // ❌ 數組不可用
// register int *p = &i; // ❌ 不能取 register 變量地址
// static register int x; // ❌ static 與 register 互斥
}
// 測試代碼
#include <time.h>
void test_auto() {
int sum = 0;
for (int i = 0; i < 100000000; i++) sum += i;
}
void test_register() {
register int sum = 0;
for (register int i = 0; i < 100000000; i++) sum += i;
}
// 現代編譯器 -O2 下兩者生成相同機器碼,耗時無差異
register 是 C 語言歷史遺留關鍵字,現代開發中幾乎無需手動使用。理解其語義有助於閱讀舊代碼,但實際性能優化應關注:算法複雜度、緩存友好訪問模式、避免不必要的內存分配、使用編譯器內建函數等更有效手段。