天天看點

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

在c++中:

(1)register 關鍵字無法在全局中定義變量,否則會被提示為不正确的存儲類。

(2)register 關鍵字在局部作用域中聲明時,可以用 & 操作符取位址,一旦使用了取位址操作符,被定義的變量會強制存放在記憶體中。

在c中:

(1)register 關鍵字可以在全局中定義變量,當對其變量使用 & 操作符時,隻是警告“有壞的存儲類”。

(2)register 關鍵字可以在局部作用域中聲明,但這樣就無法對其使用 & 操作符。否則編譯不通過。

建議不要用register關鍵字定義全局變量,因為全局變量的生命周期是從執行程式開始,一直到程式結束才會終止,而register變量可能會存放在cpu的寄存器中,如果在程式的整個生命周期内都占用着寄存器的話,這是個相當不好的舉措。

以下是摘自别人的博文:

C和C++處理register關鍵字的一處差異 2010年12月29日 星期三 13:30

  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++也許是因為沒有曆史包袱才放寬了這個限制吧。猜測而已,希望知道内幕的朋友告訴我更精确的答案。

http://hi.baidu.com/notheorem/blog/item/d482021131c85d1bc83d6d77.html