淺析C語言的一個(gè)關(guān)鍵字——register

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管它完全合法,但它僅僅是暗示而不是命令。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容