結構記憶體布局

來源:互聯網
上載者:User

本來打算寫一篇文章,詳細地討論一下結構的記憶體布局,但是想了下,跟路西菲爾的這篇文章也差不多,所以這裡只做一下補充:

一、對齊長度

如果沒有顯式的指定對齊長度,將以結構中佔用空間最大的成員的長度作為對齊長度;如果要顯式指定對齊長度,需設定StructLayoutAttribute.Pack,如:

    [StructLayout(LayoutKind.Sequential,Pack=4)]
    struct MyStruct

    {

    }

對齊長度的作用在於:如果某個欄位的長度大於或等於對齊長度,則對齊長度沒用;如果小於對齊長度,則以對齊長度為單元,佔用的空間是對齊長度的整數倍,同時保證不大於對齊長度的欄位一定分配在同一單元,並且其首地址一定是欄位長度的整數倍。

如:

    struct MyStruct

    {

        byte a;

        char b;

        int c;

    }

第0個位元組為a,第1個位元組無資料,第2,3個位元組為b,第4,5,6,7為c。

二、“詭異”的decimal類型

有這樣一個結構,請問其佔用空間是多少?

struct MyStruct

{

int a;

deciaml b;

double c;

}

最初我以為是48個位元組,因為int是4個位元組,decimal是16個位元組,double是8個位元組,decimal最大,所以以16個位元組對齊,所以是48個位元組。

但實際上是32個位元組。

這其中的原因在於,decimal是由4個int構成的:

struct Decimal

{

private int flags;
    private int hi;
    private int lo;
    private int mid;
.....//其他不佔據對象記憶體的成員

}

所以上述結構中占記憶體最大的成員是double,對齊長度是8

 

三、.Net中實現C語言的Union

可以通過下面的自訂欄位位置的方法,在.Net中實現C風格的Union

    [StructLayout(LayoutKind.Explicit)]
    struct MyStruct
    {
        [FieldOffset(0)]
        int a;
        [FieldOffset(2)]
        short b;
        [FieldOffset(3)]
        byte c;
    }

從0開始計數,第2個位元組為a,b共用,第3個位元組為a,b,c共用。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.