簡體   English   中英

如何在C#中打包小數據類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM