糯米文學吧

位置:首頁 > 計算機 > C語言

register關鍵字在c語言和c++中的差異

C語言7.44K

隨着編譯程序設計技術的進步,在決定哪些變量應該被存到寄存器中時,現在的C編譯環境能比程序員做出更好的決定。實際上,許多編譯程序都會忽略register修飾符,因為儘管它完全合法,但它僅僅是暗示而不是命令。以下是本站小編搜索整理的關於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++也許是因為沒有歷史包袱才放寬了這個限制吧。猜測而已,希望知道內幕的朋友告訴我更精確的答案。