探討register關(guān)鍵字在c語(yǔ)言和c++中的差異
在c++中:
(1)register 關(guān)鍵字無(wú)法在全局中定義變量,否則會(huì)被提示為不正確的存儲(chǔ)類。
(2)register 關(guān)鍵字在局部作用域中聲明時(shí),可以用 & 操作符取地址,一旦使用了取地址操作符,被定義的變量會(huì)強(qiáng)制存放在內(nèi)存中。
在c中:
(1)register 關(guān)鍵字可以在全局中定義變量,當(dāng)對(duì)其變量使用 & 操作符時(shí),只是警告“有壞的存儲(chǔ)類”。
(2)register 關(guān)鍵字可以在局部作用域中聲明,但這樣就無(wú)法對(duì)其使用 & 操作符。否則編譯不通過(guò)。
建議不要用register關(guān)鍵字定義全局變量,因?yàn)槿肿兞康纳芷谑菑膱?zhí)行程序開(kāi)始,一直到程序結(jié)束才會(huì)終止,而register變量可能會(huì)存放在cpu的寄存器中,如果在程序的整個(gè)生命周期內(nèi)都占用著寄存器的話,這是個(gè)相當(dāng)不好的舉措。
以下是從網(wǎng)上摘自別人的:
C和C++處理register關(guān)鍵字的一處差異
C++并不是完全兼容C語(yǔ)言的,上次提到的sizeof('a')等于幾的問(wèn)題就是一例。今天我在編碼時(shí)又無(wú)意中發(fā)現(xiàn)了一處不同:
用register關(guān)鍵字修飾的變量,在c語(yǔ)言中是不可以用&操作符取地址的,這是我已有的經(jīng)驗(yàn)。因?yàn)榫幾g器如果接受了程序員的建議把變量存入寄存器,它是不存在虛擬地址的。但在C++中,用register修飾的變量可以用&操作符取地址,這是我在一段代碼中發(fā)現(xiàn)的。如果程序中顯式取了register變量的地址,編譯器一定會(huì)將這個(gè)變量定義在內(nèi)存中,而不會(huì)定義為寄存器變量。
我在C99(ISO/IEC 9899:1999)和ISO C++(ISO/IEC 14882:2003)標(biāo)準(zhǔn)中得到了確認(rèn),C和C++標(biāo)準(zhǔn)對(duì)register遇到&的處理確實(shí)有不同的明確定義。但為什么要這樣定義?我只能從標(biāo)準(zhǔn)的字里行間猜測(cè)。K&R C1中如何描述register我尚未查證,K&R C2(ANSI C)中說(shuō)明了“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”??梢?jiàn)歷史上register關(guān)鍵字在強(qiáng)調(diào)盡可能地把變量保存到寄存器,而現(xiàn)在的register關(guān)鍵字不再?gòu)?qiáng)調(diào)具體手段,只是建議編譯器通過(guò)各種可行的方式優(yōu)化該變量的訪問(wèn)(不過(guò)很多編譯器會(huì)忽略這一關(guān)鍵字,而采用自身的優(yōu)化策略)。C99可能是為了保持對(duì)K&R C的兼容而不允許取地址操作;而C++也許是因?yàn)闆](méi)有歷史包袱才放寬了這個(gè)限制吧。猜測(cè)而已,希望知道內(nèi)幕的朋友告訴我更精確的答案。
相關(guān)文章
總結(jié)C語(yǔ)言中const關(guān)鍵字的使用
一起雖然學(xué)過(guò)c語(yǔ)言,但是并沒(méi)有寫(xiě)過(guò)太多的代碼,最近想要拾起c語(yǔ)言,就寫(xiě)了一些代碼,但是對(duì)const關(guān)鍵字比較陌生,這里總結(jié)一下,方法自己和大家有需要的時(shí)候參考借鑒,下面跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。2016-11-11Matlab實(shí)現(xiàn)黑洞優(yōu)化算法的示例代碼
根據(jù)黑洞現(xiàn)象原理首次提出BH 算法,它在傳統(tǒng)PSO基礎(chǔ)上引入了新的機(jī)制,有效地提高了收斂速度并防止了陷入局部極值的情況發(fā)生.本文將用Matlab實(shí)現(xiàn)這一算法,需要的可以參考一下2022-06-06C/C++ Qt 基本文件讀寫(xiě)的基本使用(2種實(shí)現(xiàn))
文件的讀寫(xiě)是很多應(yīng)用程序具有的功能,本文主要介紹了兩種實(shí)現(xiàn)方法,第一種使用QFile類的IODevice讀寫(xiě)功能直接讀寫(xiě),第二種是利用 QFile和QTextStream結(jié)合起來(lái),用流的方式進(jìn)行文件讀寫(xiě)2021-11-11關(guān)于數(shù)據(jù)結(jié)構(gòu)單向鏈表的各種操作
這篇文章主要介紹了關(guān)于數(shù)據(jù)結(jié)構(gòu)單向鏈表的各種操作,關(guān)于數(shù)據(jù)結(jié)構(gòu)鏈表的操作一般涉及的就是增刪改查,下面將關(guān)于無(wú)空頭鏈表展開(kāi)介紹,需要的朋友可以參考下2023-04-04C++實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05strcat函數(shù)實(shí)現(xiàn)簡(jiǎn)單示例
這篇文章主要介紹了strcat函數(shù)實(shí)現(xiàn)簡(jiǎn)單示例,需要的朋友可以參考下2014-03-03C語(yǔ)言內(nèi)存對(duì)齊實(shí)例詳解
這篇文章主要介紹了C語(yǔ)言內(nèi)存對(duì)齊,包括內(nèi)存對(duì)其的基本概念及用法,以及注意事項(xiàng),并以實(shí)例形式加以說(shuō)明,需要的朋友可以參考下2014-09-09