商量register症結字在c說話和c++中的差別。本站提示廣大學習愛好者:(商量register症結字在c說話和c++中的差別)文章只能為提供參考,不一定能成為您想要的結果。以下是商量register症結字在c說話和c++中的差別正文
在c++中:
(1)register 症結字沒法在全局中界說變量,不然會被提醒為不准確的存儲類。
(2)register 症結字在部分感化域中聲明時,可以用 & 操作符取地址,一旦應用了取地址操作符,被界說的變量會強迫寄存在內存中。
在c中:
(1)register 症結字可以在全局中界說變量,當對其變量應用 & 操作符時,只是正告“有壞的存儲類”。
(2)register 症結字可以在部分感化域中聲明,但如許就沒法對其應用 & 操作符。不然編譯欠亨過。
建議不要用register症結字界說全局變量,由於全局變量的性命周期是從履行法式開端,一向到法式停止才會終止,而register變量能夠會寄存在cpu的存放器中,假如在法式的全部性命周期內都占用著存放器的話,這是個相當欠好的舉動。
以下是從網上摘自他人的:
C和C++處置register症結字的一處差別
C++其實不是完整兼容C說話的,前次提到的sizeof('a')等於幾的成績就是一例。明天我在編碼時又有意中發明了一處分歧:
用register症結字潤飾的變量,在c說話中是弗成以用&操作符取地址的,這是我已有的經歷。由於編譯器假如接收了法式員的建議把變量存入存放器,它是不存在虛擬地址的。但在C++中,用register潤飾的變量可以用&操作符取地址,這是我在一段代碼中發明的。假如法式中顯式取了register變量的地址,編譯器必定會將這個變量界說在內存中,而不會界說為存放器變量。
我在C99(ISO/IEC 9899:1999)和ISO C++(ISO/IEC 14882:2003)尺度中獲得了確認,C和C++尺度對register碰到&的處置確切有分歧的明白界說。但為何要如許界說?我只能從尺度的字裡行間猜想。K&R C1中若何描寫register我還沒有查證,K&R C2(ANSI C)中解釋了“register variables are to be placed in machine registers ... but compilers are free to ignore the advice ”。但在C99和ISO C++中,措辭分離釀成:“suggests that access to the object be as fast as possible”、“a hint to the implementation that the object so declared will be heavily used”,不再特殊說起“machine registers”。可見汗青上register症結字在強調盡量地把變量保留到存放器,而如今的register症結字不再強調詳細手腕,只是建議編譯器經由過程各類可行的方法優化該變量的拜訪(不外許多編譯器會疏忽這一症結字,而采取本身的優化戰略)。C99能夠是為了堅持對K&R C的兼容而不許可取地址操作;而C++或許是由於沒有汗青累贅才放寬了這個限制吧。猜想罷了,願望曉得內情的同伙告知我更准確的謎底。