[英]Memory layout of C# array of struct
在 C 中,如果我有以下結構Data
:
struct __attribute__((__packed__)) Data
{
double x;
int y;
};
然后為這個結構創建一個名為val
的數組:
Data val[3];
所有存儲在val
中的值(即val[0].x
、 val[0].y
、 val[1].x
、 val[1].y
、 val[2].x
和val[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].x
和val[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.