暫存器

向編譯器提示訪問物件應該儘可能快。編譯器是否實際使用提示是實現定義的; 它可能只是將它視為與 auto 相同。

對於使用 register 宣告的所有物件,唯一明確不同的屬性是它們不能計算其地址。因此,register 可以成為確保某些優化的好工具:

register size_t size = 467;

是一個永遠不能別名的物件,因為沒有程式碼可以將其地址傳遞給另一個可能意外更改的函式。

此屬性還暗示了一個陣列

register int array[5];

不能衰變成指向其第一個元素的指標(即 array 變成 &array[0])。這意味著無法訪問此類陣列的元素,並且無法將陣列本身傳遞給函式。

事實上,使用 register 儲存類宣告的陣列的唯一合法用法是 sizeof 運算子; 任何其他運算子都需要陣列的第一個元素的地址。出於這個原因,陣列通常不應該使用 register 關鍵字宣告,因為它使得除了整個陣列的大小計算之外的其他任何東西都沒用,這可以在沒有 register 關鍵字的情況下輕鬆完成。

register 儲存類更適合於在塊內定義並以高頻率訪問的變數。例如,

/* prints the sum of the first 5 integers*/
/* code assumed to be part of a function body*/ 
{ 
    register int k, sum;
    for(k = 1, sum = 0; k < 6; sum += k, k++);
        printf("\t%d\n",sum);
}

Version >= C11

_Alignof 運算元也允許與 register 陣列一起使用。