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
且存储依然正确:

#####
愿你一寸一寸地攻城略地,一点一点地焕然一新
#####

浙公网安备 33010602011771号