現在我正在學習存儲類here。他似乎也解釋了自動存儲類和寄存器存儲類的相同情況。他在兩者之間唯一的區別在於寄存器存儲類存儲在CPU寄存器中。這些存儲類之間有什麼區別嗎?寄存器存儲類的任何用途?在某些C編譯器中,默認情況下是Register關鍵字?註冊vs Auto Storage課程?
register int x = 5;
auto int y = 3;
現在我正在學習存儲類here。他似乎也解釋了自動存儲類和寄存器存儲類的相同情況。他在兩者之間唯一的區別在於寄存器存儲類存儲在CPU寄存器中。這些存儲類之間有什麼區別嗎?寄存器存儲類的任何用途?在某些C編譯器中,默認情況下是Register關鍵字?註冊vs Auto Storage課程?
register int x = 5;
auto int y = 3;
register
存儲類並不意味着對象將存儲在寄存器中。標準表示:
的標識符與存儲類 符
register
對象的聲明表明,訪問對象是儘可能快 越好。這些建議的有效程度是實現定義的 。
(該報價是從N1570草案ISO C標準的,部分6.7.1第6段)
存儲在一個CPU寄存器,而不是在存儲器中的對象是一種方法來實現這一目標,但不是唯一的一個。
現代編譯器(至少根據常識)可能比決定哪些變量應該存儲在寄存器中以獲得速度更好,因此使用register
關鍵字可能不會干擾除編譯器優化。
register
也使非法取對象的地址(即使它存儲在內存中)。
它基本上是從早期的編譯器(1970年代),沒有執行現代編譯器所做的複雜優化的保留。對於這樣的編譯器register
可以顯着提高性能。我認爲現代編譯器首先假設所有變量都可以在寄存器中分配,並且只在必要時將它們「溢出」到內存中,或者是因爲變量的地址是必需的,或者是因爲沒有足夠的可用寄存器)
默認情況下,塊範圍對象是'auto',所以說明符完全沒用。 'register'只對lobotomized編譯器很重要。 – EOF
爲什麼它只關注lobotomized編譯器?而這甚至意味着什麼? @EOF – amanuel2
如果您使用像gcc,icc或clang這樣的現代編譯器並啓用了適度的優化設置,編譯器將分配沒有取得地址的對象(或者地址不會轉義該函數)保存在cpu-registers中,不管你是否聲明它們是「register」。 – EOF