1、register修飾符暗示編譯程序相應(yīng)的變量將被頻繁地使用,如果可能的話,應(yīng)將其保存在CPU的寄存器中,以加快其存儲(chǔ)速度。例如下面的內(nèi)存塊拷貝代碼,
/* Procedure for the assignment of structures, /
/ if the C compiler doesn't support this feature */
#ifdef NOSTRUCTASSIGN
memcpy (d, s, l)
{
register char *d;
register char s;
register int i;
while (i--)
d++ = *s++;
}
endif
2、但是使用register修飾符有幾點(diǎn)限制
(1)register變量必須是能被CPU所接受的類型。
這通常意味著register變量必須是一個(gè)單個(gè)的值,并且長(zhǎng)度應(yīng)該小于或者等于整型的長(zhǎng)度。不過,有些機(jī)器的寄存器也能存放浮點(diǎn)數(shù)。
(2)因?yàn)閞egister變量可能不存放在內(nèi)存中,所以不能用“&”來獲取register變量的地址。
(3)只有局部自動(dòng)變量和形式參數(shù)可以作為寄存器變量,其它(如全局變量)不行。
在調(diào)用一個(gè)函數(shù)時(shí)占用一些寄存器以存放寄存器變量的值,函數(shù)調(diào)用結(jié)束后釋放寄存器。此后,在調(diào)用另外一個(gè)函數(shù)時(shí)又可以利用這些寄存器來存放該函數(shù)的寄存器變量。
(4)局部靜態(tài)變量不能定義為寄存器變量。不能寫成:register static int a, b, c;
(5)由于寄存器的數(shù)量有限(不同的cpu寄存器數(shù)目不一),不能定義任意多個(gè)寄存器變量,而且某些寄存器只能接受特定類型的數(shù)據(jù)(如指針和浮點(diǎn)數(shù)),因此真正起作用的register修飾符的數(shù)目和類型都依賴于運(yùn)行程序的機(jī)器,而任何多余的register修飾符都將被編譯程序所忽略。
注意:
早期的C編譯程序不會(huì)把變量保存在寄存器中,除非你命令它這樣做,這時(shí)register修飾符是C語言的一種很有價(jià)值的補(bǔ)充。然而,隨著編譯程序設(shè)計(jì)技術(shù)的進(jìn)步,在決定哪些變量應(yīng)該被存到寄存器中時(shí),現(xiàn)在的C編譯環(huán)境能比程序員做出更好的決定。實(shí)際上,許多編譯程序都會(huì)忽略register修飾符,因?yàn)楸M管它完全合法,但它僅僅是暗示而不是命令。