[英]How are small data types packed in C#
我不打算提高性能或內存使用率,這個問題純粹是出於好奇。
主要問題鑒於以下類,C#編譯器(Mono + .NET)將兩個short
變量打包成4個字節或者它們將消耗8個字節(帶對齊)?
public class SomeClass {
short a;
short b;
}
次要問題如果對上述問題的答案不是4個字節,那么以下替代方案是否會提供任何優勢(其中SomeClass
的使用量非常大):
// Warning, my bit math might not be entirely accurate!
public class SomeClass {
private int _ab;
public short a {
get { return _ab & 0x00ff; }
set { _ab |= value & 0x00ff;
}
public short b {
get { return _ab >> 8; }
set { _ab |= value << 8; }
}
}
這取決於運行時,正如@David_M所說,但您可以使用[StructLayout]
屬性強制它,該屬性具有可用於控制打包的Pack
成員。 或者,您可以使用[FieldOffset]
手動布局結構的成員(甚至重疊,這是您在.NET中實現聯合的方式)。
這取決於運行時,而不是編譯器。 您可以使用[StructLayout]
覆蓋默認行為,這可能有所幫助 - 盡管默認行為應該沒問題。
話雖這么說,如果最小化總大小是絕對要求,您可能需要考慮struct
而不是class
。 使用類時,類的每個實例都會增加很多開銷。 在syncblk,TypeHandle等之間,以及引用(在64位系統上是另外8個字節)對象實例使用相當數量的“額外”內存超出你的兩個短路。 有關詳細信息,請參閱“CLR如何創建運行時對象” 。
將數據存儲到一組值類型中可以完全避免這種情況,並將實例總數減少到每個8字節(加上收集開銷)。 當然,這會改變使用方面的語義,但是如果你只使用兩個短路,這將減少你的類型所涉及的開銷量,特別是在64位系統上。
實際布局取決於運行時,因為其他人已經評論主要是因為您可以跨多個平台運行相同的代碼。
是的,如果有許多物體可以節省空間。 您正在尋找的是LayoutKind(StructLayout屬性)。 它可以讓你隨心所欲地打包成員。 例如,使用Sequential,它將確保它緊湊。
[StructLayout(LayoutKind.Sequential)]
public class SomeClass {
short a;
short b;
}
有關詳細信息,請查看MSDN- Structlayout
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.