gpt4 book ai didi

c# - C#结构数组的内存布局

转载 作者:行者123 更新时间:2023-12-05 03:31:32 32 4
gpt4 key购买 nike

在 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在内存中是连续的。

现在,当在 C# 中具有以下结构时:

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

然后创建一个名为 val 的数组:

Data val[3];

我希望存储在 val 中的所有值在内存中都是连续的,但它们不是(根据我进行的测试)。详细来说,val[0].xval[0].y 都是连续的,但是它们与val[1] 不连续>(反过来,它与 val[2] 不连续)。

我的问题是:在 C# 中,如何创建一个特定结构的变量(即数组),使其所有元素和成员在内存中都是连续的?

最佳答案

为了尝试一下,我做了一个非常简单的项目:使用 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();
}
}

}
}
}

输出:

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

这对我来说看起来是完美连续的,除非我遗漏了什么

关于c# - C#结构数组的内存布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70624945/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com