探討register關鍵字在c語言和c++中的差異
在c++中:
(1)register 關鍵字無法在全局中定義變量,否則會被提示為不正確的存儲類。
(2)register 關鍵字在局部作用域中聲明時,可以用 & 操作符取地址,一旦使用了取地址操作符,被定義的變量會強制存放在內(nèi)存中。
在c中:
(1)register 關鍵字可以在全局中定義變量,當對其變量使用 & 操作符時,只是警告“有壞的存儲類”。
(2)register 關鍵字可以在局部作用域中聲明,但這樣就無法對其使用 & 操作符。否則編譯不通過。
建議不要用register關鍵字定義全局變量,因為全局變量的生命周期是從執(zhí)行程序開始,一直到程序結束才會終止,而register變量可能會存放在cpu的寄存器中,如果在程序的整個生命周期內(nèi)都占用著寄存器的話,這是個相當不好的舉措。
以下是從網(wǎng)上摘自別人的:
C和C++處理register關鍵字的一處差異
C++并不是完全兼容C語言的,上次提到的sizeof('a')等于幾的問題就是一例。今天我在編碼時又無意中發(fā)現(xiàn)了一處不同:
用register關鍵字修飾的變量,在c語言中是不可以用&操作符取地址的,這是我已有的經(jīng)驗。因為編譯器如果接受了程序員的建議把變量存入寄存器,它是不存在虛擬地址的。但在C++中,用register修飾的變量可以用&操作符取地址,這是我在一段代碼中發(fā)現(xiàn)的。如果程序中顯式取了register變量的地址,編譯器一定會將這個變量定義在內(nèi)存中,而不會定義為寄存器變量。
我在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關鍵字在強調(diào)盡可能地把變量保存到寄存器,而現(xiàn)在的register關鍵字不再強調(diào)具體手段,只是建議編譯器通過各種可行的方式優(yōu)化該變量的訪問(不過很多編譯器會忽略這一關鍵字,而采用自身的優(yōu)化策略)。C99可能是為了保持對K&R C的兼容而不允許取地址操作;而C++也許是因為沒有歷史包袱才放寬了這個限制吧。猜測而已,希望知道內(nèi)幕的朋友告訴我更精確的答案。
相關文章
Matlab實現(xiàn)黑洞優(yōu)化算法的示例代碼
根據(jù)黑洞現(xiàn)象原理首次提出BH 算法,它在傳統(tǒng)PSO基礎上引入了新的機制,有效地提高了收斂速度并防止了陷入局部極值的情況發(fā)生.本文將用Matlab實現(xiàn)這一算法,需要的可以參考一下2022-06-06
C/C++ Qt 基本文件讀寫的基本使用(2種實現(xiàn))
文件的讀寫是很多應用程序具有的功能,本文主要介紹了兩種實現(xiàn)方法,第一種使用QFile類的IODevice讀寫功能直接讀寫,第二種是利用 QFile和QTextStream結合起來,用流的方式進行文件讀寫2021-11-11

