2012-06-25 26 views
0

我是外國人讀取C99指定符「註冊」,而一個句子(在6.7.1)讓我困惑:存儲類在C99語義

  • 「(A的標識符的一個對象的聲明與存儲級 說明符寄存器建議訪問該對象的速度可能高達 。)此類建議的有效程度爲 實現定義。'

我應該如何解析第二句子:

  • 的程度,其中這樣的建議是有效,是實現定義。
  • 這些建議有效的範圍是實現定義的。

哪一個更好?

這是否意味着實施方案擁有全權決定如何處理註冊,甚至是終止翻譯?

謝謝。

+0

基礎短語是「X到範圍」,因此在相對子句形式中它是「範圍{到X ...}」。 –

回答

0

否 - 建議有效的程度是實施定義的,但整個代碼的效果不是。

說得略有不同,當/如果你把register到你的代碼(在允許的情況),編譯器可以完全忽略它 - 我覺得有必要補充一點,幾乎所有合理的現代編譯器

儘管如此,僅僅存在register並不會阻止代碼編譯,除非您嘗試將其應用於不允許的地方(例如全局變量)。底線:不要使用它,但不要擔心將它從已有的代碼中移除。這是浪費時間和精力,但合理的現代編譯器是完全無害的。

+1

編譯器不能*完全忽略寄存器。這是違反約束(需要診斷)將'&'運算符應用於具有寄存器存儲類的對象。我認爲還有其他一些例子。 –

0

註冊是舊的關鍵字。基本上,這是優化器的一個暗示,告訴我們最好使用寄存器來存儲這個變量。你提到的pharse意味着編譯器可以以任何想要的方式處理這個提示。在我們優化編譯器的日子裏,它對99%的含義和價值毫無意義。

1

不要將register變量與CPU的寄存器混合在一起。這些不一樣。

register具有優化的目的。取一個這樣的變量的地址是被禁止的,因此這樣的變量永遠不會變成別名,編譯器總是掌握它的最新值。因此,例如,它可以像CPU寄存器或彙編程序那樣容易地實現這樣的變量。

作爲一個特定的子情況,有const限定的register變量,不能由程序直接更改,也不能由一些其他代碼通過指針訪問它。只有這樣的變量可以很容易地保證在整個程序執行過程中保持不變。

+0

允許編譯器假定任何聲明爲const的變量沒有被修改,因爲這樣做有未定義的行爲。 '註冊'是沒有必要的。 – caf

+0

@caf,編譯器是允許的,你不是:)修改一個'const'聲明的對象是「只是」未定義的行爲。考慮一個'register'變量的地址是違反約束的,這是一個更強大的屬性。 'register'是一種提供給程序員的服務,用於緩解關於代碼的斷言。 –

+0

我不確定你說的*「編譯器允許,你不是」*。程序員不需要假設;程序員知道。 – caf