網站首頁 語言 會計 網際網路計算機 醫學 學歷 職場 文藝體育 範文
當前位置:學識谷 > 計算機 > C語言

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

欄目: C語言 / 釋出於: / 人氣:6.54K

隨著編譯程式設計技術的進步,在決定哪些變數應該被存到暫存器中時,現在的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++也許是因為沒有歷史包袱才放寬了這個限制吧。猜測而已,希望知道內幕的朋友告訴我更精確的答案。