2010-09-30 106 views
2

因爲我知道在C中我們可以使用關鍵字「register」來向編譯器建議變量應該存儲在CPU寄存器中。涉及CPU指令的所有變量最終都將存儲在CPU寄存器中以便執行,這是不是真的?爲什麼我們需要建議一個變量存儲在寄存器中?

+0

這個相關的問題可能會有幫助:[「在C中註冊關鍵字?](http://stackoverflow.com/questions/578202/register-keyword-in-c) – 2010-09-30 07:46:59

回答

5

register關鍵字是一種告訴編譯器該變量被大量使用的方式。確實,通常必須將值暫時加載到寄存器中以對其執行計算。這個名字來源於這樣一種想法,即編譯器可能會將變量保存在寄存器中的整個持續時間範圍內,而不是隻在臨時用於計算時。

由於現代編譯器可以在程序員沒有幫助的情況下確定何時大量使用變量(以及何時不使用其地址),因此該關鍵字已過時用於優化。

+0

如何確定範圍的「持續時間」? C中的塊? – woongiap 2010-09-30 07:54:36

+0

編譯器確定您的持續時間 - 優化後可能少於或多於源代碼塊/範圍。如果該值未在範圍的後半部分使用,並且內存/寄存器可以有效地用於其他內容,則更少;如果該值以某種方式返回到當前塊之外,並且出於效率原因應該保持活動狀態當前範圍。 – 2010-09-30 08:06:21

+0

-1:關鍵字不會過時。不幸的是,現在它與目標機器的寄存器沒有多大關係,但唯一的含義是你不能獲取該變量的地址。這可以是一個寶貴的優化提示,並且在安全性方面也很重要。它阻礙了你無意中暴露了堆棧變量的地址。 – 2010-09-30 08:30:50

1

在過去,編譯器並不像現在這樣聰明。這是編程人員向編譯器提示的,該變量應存儲在寄存器中,以便快速訪問/修改。今天,幾乎所有體面的編譯器都實現了聰明的寄存器分配算法,它們擊敗了人類的頭腦。

4

您應該不是使用register關鍵字。這是一個古老的遺物,保持向後兼容性。大多數編譯器都會忽略它(默認情況下)。

可能有例外,但它們非常罕見,請查閱您的編譯器手冊。

是不是所有涉及CPU指令的變量最終都會存儲在CPU寄存器中執行?

是的,的確如此。但是CPU寄存器是有限的,所以變量通常從'普通'存儲器加載/存儲,並且只是簡單地存在於寄存器中。 register關鍵字是(是)指示應該佔用更長寄存器的高優先級變量的一種方式。像for(i = 0; ...)中的i一樣。

+3

只是因爲我不應該使用它'我不應該問這個問題 – woongiap 2010-09-30 07:56:42

+0

@woong:你絕對是對的。但是我的回答從關於「註冊」的最重要的事情開始。 – 2010-09-30 08:04:34

+0

@亨克:謝謝,我只是對在手冊上閱讀它的定義感到好奇,我不會使用它,到目前爲止您認爲哪個答案最好? – woongiap 2010-09-30 08:09:49

1

大多數變量將加載進入寄存器很短的時間...只要有必要做什麼需要與他們做什麼。 register關鍵字暗示他們應該在那裏保留

雖然編譯器的優化已經變得非常好,但register關鍵字並不是很有幫助。事實上,如果你的編譯器根本不尊重它(甚至不這樣做),它甚至會讓你感到困惑(通過捆綁編譯器的手,使某些優化成爲不可能)。所以現在這是一個非常糟糕的主意。

+0

感謝您的回答,只是caf是第一個提供正確答案的人 – woongiap 2010-09-30 08:22:22

相關問題