2009-12-21 61 views
5

有點學術問題,但是:價值類型如何像Int實際上工作Value類型如何在.net中工作?

我在mscorlib上使用了Reflector來了解System.Int32是如何實現的,它只是一個從System.ValueType繼承的Struct。我正在尋找一個位數組中的值來保存值,但我只找到一個聲明爲int的字段 - 這意味着它是一個循環引用?

我的意思是,我可以寫「int i = 14;」,但數字14需要以某種方式存儲在某處,但我無法找到「32位數組」或指針或其他東西。

這是編譯器所做的一些神奇的事情嗎?這些神奇的類型是規範的一部分嗎? (類似於System.Attribute或System.Exception如何是「特殊」類型)

編輯:如果我聲明我自己的結構,我向它添加字段。這些字段是內置類型的,例如int。所以CLR知道我擁有一個int。但是它是如何知道int是32位的?這只是說明規範指定了某些基本類型,因此使它們變得「神奇」,還是存在技術機制?假設的例子:如果我想要聲明一個Int36,這是一個36位的整數,我可以創建一個類似於Int32的,正如,除了4個額外的位之外,通過指定「好吧,擱置36比特「,還是內置的原語設置石頭,我不得不以某種方式解決這個問題(即通過使用Int64和代碼,只設置最後36位)?

正如所說,所有非常學術和假設的,但我總是想知道這一點。

+0

其實很好的問題,我想知道自己的魔法是什麼。 – Pierreten

+0

我也是,我期待這個問題是關於價值類型如何工作,即堆棧和堆分配等,但我對此自我感到好奇。 – Davy8

+1

重新編輯:據我所知,如果你想創建一個Int36,你將不得不以某種方式在C#或IL中指定它,這將迫使你使用Int32 + Int8或Int64以及最後的28個位被忽略或者其他。將Int36添加到原始底層虛擬機並讓它理解位級表示的唯一方法是實現您自己的CLR a la Mono或Rotor。 – itowlson

回答

3

某些基本類型(如整數)是CLI規範的一部分。例如,有些特定的IL指令(如ldc.i4)用於加載這些類型的值,IL指令(如add)具有這些類型的特定知識。 (你的int i = 14例如將被編譯到ldc.i4 14,與14內部表示爲編譯MSIL內的操作碼的一部分。)

欲瞭解更多信息,請參閱CLI spec,第7.2節的分區IIA,「內建類型「。 (無法找到特定部分的鏈接,對不起。)內置類型爲:bool,char,object,string,float32,float64,int [8 | 16 | 32 | 64],unsigned int [8 | 1632 | 64],本地int(IntPtr),本機無符號整數和typedref。該規範指出,他們「在基類庫中定義了相應的值類型」,這使我認爲Int32實際上是一種圍繞「真實」的int32的元數據封裝,它在VES級別上生存。

其他值類型,如System.Decimal,System.Drawing.Point或您在自己的代碼中定義的任何結構都是不可思議的。

+0

謝謝。因此,在我的假設的Int36示例中,除了使用內置類型(即Int64或bool [36])並且手動對其餘類型進行編碼之外,我沒有別的選擇了嗎? –

+0

正確。請參閱關於您的問題的「重新編輯」評論。除非您實施自己的CLR,否則您無法訪問比特級別的級別。 – itowlson

1

Int32是一個編譯器的內在類型,這意味着編譯器有特殊的邏輯來處理它。框架中Int32的實際實現毫無意義。

值得注意的是,Int16,Int32,UInt16,UInt32,Single,Double等大致對應於x86指令集(及其他)本機的類型。創建一個Int36類型同樣需要使用本地類型作爲純彙編代碼的基礎。

+0

謝謝。是的,我猜我會遇到各種各樣的性能問題(對齊/填充,需要在ia32等上進行2次讀取/寫入...)。 –