2011-05-29 80 views
19

我剛剛纔知道我們可以在C++程序中明確地使用寄存器。我想知道如果我在一個C++程序中聲明並使用所有可用的寄存器並運行相當長的時間。我的系統的行爲會有多糟糕,並且os會採取什麼措施(如果有的話)才能擺脫困境。在C++中使用寄存器變量可以做多少壞

回答

14

register關鍵字向編譯器指示該變量不需要在主存儲器中可尋址。因此,編譯器可以確定沒有指向該值的指針並相應地進行優化。

過度使用寄存器關鍵字是不可能對現代系統嚴重的負面影響。每個線程在執行期間都保持自己的寄存器值,其寄存器使用情況不會對其他線程產生任何直接影響。編譯器會拒絕或忽略無法生成可行程序的寄存器用法。不良的註冊使用最多隻會降低性能,操作系統不會採取特殊行動。

+1

不錯的鏈接!謝謝。 – 2011-05-29 20:09:59

6

register關鍵字只是編譯器的一個建議,可以忽略。讓編譯器爲你做優化。

15

只有特定數量的寄存器可用於您的C++程序。

此外,這只是編譯器的一個建議,大多數編譯器可以自己做這個優化,所以沒有太多的使用register關鍵字,因爲編譯器可能會也可能不會遵循這個建議。

因此register關鍵字與現代編譯器的唯一不同之處在於阻止您使用&來獲取變量的地址。

要詢價香草薩特在此:
Never write register. It's exactly as meaningful as whitespace

+1

@Downvoter:downvote的任何解釋? – 2011-05-30 03:39:21

+0

是的。引用Sutter,以及你的段落採用'&'。 – 2012-07-25 02:21:45

24

編譯器會簡單地忽略register關鍵字,所以你不會用完寄存器。無論如何,它可能會忽略它 - 編譯器通常比寄存器配置好得多。

4

register關鍵字對編譯器來說只是一個禮貌的建議,您認爲這個變量會被大量使用,而且可能會很漂亮 - 請將它保存在一個寄存器中。編譯器可以自由地忽略這個建議,事實上,通常會在現代環境中這樣做。

register基本上是一箇舊的,效率非常低的C編譯器的退化殘留,這些殘餘的C編譯器在返回時可用。 (事實上​​,導致像Duff's Device和其他怪物一樣的編譯器的相同編譯器。)現代編譯器的能力遠遠超過了跟蹤哪些變量應該放入哪個寄存器的哪個位置。因此,他們會毫不客氣地禮貌地漠視你。

1

無論如何,所有的CPU寄存器都可以被程序使用,所以在使用它們時沒有任何異常。 OS甚至不會注意到它。

4

Als發佈了Herb Sutter在關鍵詞上的文章鏈接。我同意薩特不應該使用註冊。我不同意他註冊是否毫無意義。

它比無意義更糟糕。

我看過代碼,其中有一個符合寄存器的變量後來與「&」一起使用。代碼有幾十個和數十個變量符合註冊條件。而最終的瑣事,「註冊易變的富有;」

千萬不要使用「註冊」。

+1

Downvoted for「Never use register」。註冊關鍵字在嵌入式系統中非常重要,您在那裏故意處理硬件並知道它必須在沒有任何豁免的情況下工作。另外,您可能對這篇關於Duff設備的文章感興趣,需要註冊:http://en.wikipedia.org/wiki/Duff's_device – ovanes 2011-06-24 11:11:24

+1

@ovanes:Duff的設備不需要「註冊」。如果你擺脫了'register'說明符,它工作得很好(或者不太好,這取決於讀者的觀點)。對於標準C和C++,「register」指示符只是一個提示,並且是一個非常弱的提示。 「寄存器」不過是一個弱點的編譯器(例如,特定於平臺的嵌入式編譯器)不符合標準(而且它們經常偏離其他地方)。當你爲這樣的編譯器編寫代碼時,你並不是真正在編寫C/C++。您正在使用一些與C/C++非常相似的自定義語言編寫代碼。 – 2011-06-24 11:31:58

+1

我部分同意你的看法,但你不能簡單地說:絕對不要使用「註冊」。重點是:C/C++被開發爲儘可能接近硬件,爲程序員提供高效率。當然,嵌入式開發人員有時使用內部函數和編譯器特定的語言擴展,這使得應用程序不可移植,但人們仍然編寫C++代碼。並且該代碼依賴於特定平臺的編譯器輔助,否則將導致C++無法用於這種平臺。這可能會變成90%左右,或者當前使用C++的情況。 – ovanes 2011-06-24 13:10:10