2016-06-29 68 views
0

現在我正在學習存儲類here。他似乎也解釋了自動存儲類和寄存器存儲類的相同情況。他在兩者之間唯一的區別在於寄存器存儲類存儲在CPU寄存器中。這些存儲類之間有什麼區別嗎?寄存器存儲類的任何用途?在某些C編譯器中,默認情況下是Register關鍵字?註冊vs Auto Storage課程?

register int x = 5; 
auto int y = 3; 
+1

默認情況下,塊範圍對象是'auto',所以說明符完全沒用。 'register'只對lobotomized編譯器很重要。 – EOF

+0

爲什麼它只關注lobotomized編譯器?而這甚至意味着什麼? @EOF – amanuel2

+1

如果您使用像gcc,icc或clang這樣的現代編譯器並啓用了適度的優化設置,編譯器將分配沒有取得地址的對象(或者地址不會轉義該函數)保存在cpu-registers中,不管你是否聲明它們是「register」。 – EOF

回答

4

register存儲類並不意味着對象將存儲在寄存器中。標準表示:

的標識符與存儲類 符register對象的聲明表明,訪問對象是儘可能快 越好。這些建議的有效程度是實現定義的 。

(該報價是從N1570草案ISO C標準的,部分6.7.1第6段)

存儲在一個CPU寄存器,而不是在存儲器中的對象是一種方法來實現這一目標,但不是唯一的一個。

現代編譯器(至少根據常識)可能比決定哪些變量應該存儲在寄存器中以獲得速度更好,因此使用register關鍵字可能不會干擾除編譯器優化。

register也使非法取對象的地址(即使它存儲在內存中)。

它基本上是從早期的編譯器(1970年代),沒有執行現代編譯器所做的複雜優化的保留。對於這樣的編譯器register可以顯着提高性能。我認爲現代編譯器首先假設所有變量都可以在寄存器中分配,並且只在必要時將它們「溢出」到內存中,或者是因爲變量的地址是必需的,或者是因爲沒有足夠的可用寄存器)

+0

首先..我們見面了嗎?你是大會聊天室中的人嗎?第二關....嗯,我聽到最後的評論某處我忘了對不起。非常感謝你的安娜:) – amanuel2

+0

@Dsafds:不,我不在大會聊天室(不知道那是什麼)。不客氣。 –

+0

Keith的一個簡單問題,爲什麼我們甚至會使用auto關鍵字?劑量它默認爲它?對不起,我認爲我們見面了,有人的頭像和你的一樣,或者看起來非常相似,我猜。 – amanuel2