国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

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

2020-01-26 15:45:48
字體:
來源:轉載
供稿:網友

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 定西市| 武夷山市| 杭锦后旗| 娄烦县| 潼南县| 佛教| 宽城| 临桂县| 镇赉县| 潮州市| 大埔县| 桂东县| 东乌珠穆沁旗| 突泉县| 维西| 自治县| 桂平市| 乐安县| 临邑县| 霍林郭勒市| 咸宁市| 洪洞县| 丽江市| 长泰县| 和平区| 独山县| 建始县| 天全县| 游戏| 杭锦后旗| 秭归县| 四平市| 沁水县| 辽阳市| 西盟| 房产| 平顶山市| 吴桥县| 阿城市| 宜章县| 广昌县|