簡體   English   中英

Memory C# 結構數組的布局

[英]Memory layout of C# array of struct

在 C 中,如果我有以下結構Data

struct __attribute__((__packed__)) Data
{
    double x;
    int y;
};

然后為這個結構創建一個名為val的數組:

Data val[3];

所有存儲在val中的值(即val[0].xval[0].yval[1].xval[1].yval[2].xval[2].y是連續的在 memory 中。

現在,當在 C# 中具有以下結構時:

[StructLayout(LayoutKind.Sequential, Pack=0)]
struct Data
{
    public double x;
    public int y;
}

然后為這個結構創建一個名為val的數組:

Data val[3];

我希望存儲在val中的所有值在 memory 中都是連續的,但它們不是(基於我進行的測試)。 詳細地說, val[0].xval[0].y都是連續的,但它們與val[1]不連續(而后者又與val[2]不連續)。

我的問題是:在 C# 中,如何創建某個結構的變量(即數組),該結構的所有元素和成員在 memory 中都是連續的?

為了嘗試,我做了一個非常簡單的項目:使用Pack=1似乎可以完美地打包到最小的字節。

重現代碼(在控制台應用程序上):

[StructLayout(LayoutKind.Sequential, Pack=1)]
struct Data
{
    public double x;
    public int y;
}

class Program {
    static void Main()
    {
        Data[] val = new Data[3] {
            new Data { x = 0, y = 0 },
            new Data { x = 1, y = 1 },
            new Data { x = 2, y = 2 },
        };

        for(var i = 0; i < 3; i++)
        {
            Console.WriteLine("data[" + i + "].x = " + BitConverter.ToString(BitConverter.GetBytes(val[i].x)));
            Console.WriteLine("data[" + i + "].y = " + BitConverter.ToString(BitConverter.GetBytes(val[i].y)));
        }       

        unsafe {
            fixed (Data *p = &val[0])
            {
                byte *c = (byte *)p;
                for(var j = 0; j < 3; j++)
                {
                    for(var i = 0; i < Marshal.SizeOf<double>(); i++, c++)
                    {
                        if(i!=0) Console.Write("-");
                        Console.Write("{0:X2}", *c);
                    }
                    Console.WriteLine();
                    for(var i = 0; i < Marshal.SizeOf<int>(); i++, c++)
                    {
                        if(i!=0) Console.Write("-");
                        Console.Write("{0:X2}", *c);
                    }
                    Console.WriteLine();
                }
            }

        }
    }
}

Output:

data[0].x = 00-00-00-00-00-00-00-00
data[0].y = 00-00-00-00
data[1].x = 00-00-00-00-00-00-F0-3F
data[1].y = 01-00-00-00
data[2].x = 00-00-00-00-00-00-00-40
data[2].y = 02-00-00-00
00-00-00-00-00-00-00-00
00-00-00-00
00-00-00-00-00-00-F0-3F
01-00-00-00
00-00-00-00-00-00-00-40
02-00-00-00

這對我來說看起來完全連續,除非我錯過了什么

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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