C#之不安全代码存储结构数组

[StructLayout(LayoutKind.Sequential,Pack =1)]//Pack此时设为1
public struct MyStrct
{
    public float a;
    public float b;
    public float c;
    public float d;
    byte  e;
}

public unsafe struct MyStructB
{
    private fixed byte _structBuffer[4 * 17];//Pack是1时候Mystruct是17字节,Pack是4的时候,传入4*20
    public void SetValue(int index,MyStrct value)
    {
        fixed(byte* ptr = _structBuffer)
        {
            ((MyStrct*)ptr)[index] = value;//强转为Mystct*,则步长为Mystrct的步长,索引访问符,则等价于*(ptr+index*sizeof(Mystrct))
        }
    }
    public MyStrct GetValue(int index)
    {
        if(index<0 || index >= 4)
        {
            throw new IndexOutOfRangeException();
        }
        fixed(byte* ptr= _structBuffer)
        {
            return ((MyStrct*)ptr)[index];
        }
    }
}
Console.WriteLine($"Size is{Marshal.SizeOf<MyStrct>()}");
MyStructB b= new MyStructB();
b.SetValue(0, new MyStrct() { a = 1, b = 2, c = 3, d = 4 });
b.SetValue(1, new MyStrct() { a = 5, b = 6, c = 7, d = 8 });
b.SetValue(2, new MyStrct() { a = 9, b = 10, c = 11, d = 12 });
b.SetValue(3, new MyStrct() { a = 13, b = 14, c = 15, d = 16 });
for(int i = 0; i < 4; i++)
{
   var a = b.GetValue(i);
    Console.WriteLine($"[{i}]:{a.a},{a.b},{a.c},{a.d}");
}

pack为1:
size=4*4+1=17
且存储依然正确:

pack为4:
size=4*4+4=20
且存储依然正确:

posted @ 2025-06-05 22:55  JohnYang819  阅读(11)  评论(0)    收藏  举报