我是外國人讀取C99指定符「註冊」,而一個句子(在6.7.1)讓我困惑:存儲類在C99語義
- 「(A的標識符的一個對象的聲明與存儲級 說明符寄存器建議訪問該對象的速度可能高達 。)此類建議的有效程度爲 實現定義。'
我應該如何解析第二句子:
- 的程度,其中這樣的建議是有效,是實現定義。
- 這些建議有效的範圍是實現定義的。
哪一個更好?
這是否意味着實施方案擁有全權決定如何處理註冊,甚至是終止翻譯?
謝謝。
我是外國人讀取C99指定符「註冊」,而一個句子(在6.7.1)讓我困惑:存儲類在C99語義
我應該如何解析第二句子:
哪一個更好?
這是否意味着實施方案擁有全權決定如何處理註冊,甚至是終止翻譯?
謝謝。
否 - 建議有效的程度是實施定義的,但整個代碼的效果不是。
說得略有不同,當/如果你把register
到你的代碼(在允許的情況),編譯器可以完全忽略它 - 我覺得有必要補充一點,幾乎所有合理的現代編譯器將。
儘管如此,僅僅存在register
並不會阻止代碼編譯,除非您嘗試將其應用於不允許的地方(例如全局變量)。底線:不要使用它,但不要擔心將它從已有的代碼中移除。這是浪費時間和精力,但合理的現代編譯器是完全無害的。
編譯器不能*完全忽略寄存器。這是違反約束(需要診斷)將'&'運算符應用於具有寄存器存儲類的對象。我認爲還有其他一些例子。 –
註冊是舊的關鍵字。基本上,這是優化器的一個暗示,告訴我們最好使用寄存器來存儲這個變量。你提到的pharse意味着編譯器可以以任何想要的方式處理這個提示。在我們優化編譯器的日子裏,它對99%的含義和價值毫無意義。
不要將register
變量與CPU的寄存器混合在一起。這些不一樣。
register
具有優化的目的。取一個這樣的變量的地址是被禁止的,因此這樣的變量永遠不會變成別名,編譯器總是掌握它的最新值。因此,例如,它可以像CPU寄存器或彙編程序那樣容易地實現這樣的變量。
作爲一個特定的子情況,有const
限定的register
變量,不能由程序直接更改,也不能由一些其他代碼通過指針訪問它。只有這樣的變量可以很容易地保證在整個程序執行過程中保持不變。
基礎短語是「X到範圍」,因此在相對子句形式中它是「範圍{到X ...}」。 –