C#结构体布局规则
以下两个结构体,虽然字段完全一模一样,但因为Pack方式不同,导致它们实际占用内存大小是不一样的!
[StructLayout(LayoutKind.Sequential,Pack =1)]//无填充,紧密排布
public struct TestAStrc
{
byte a;//1 Bit
float b;//4 Byte
}
[StructLayout(LayoutKind.Sequential, Pack = 4)]//4字节对齐
public struct TestBStrct
{
byte a;//1 Bit
float b;//4 Byte
}
static void Main(string[] args)
{
Console.WriteLine(System.Runtime.InteropServices.Marshal.SizeOf<TestAStrc>());
Console.WriteLine(System.Runtime.InteropServices.Marshal.SizeOf<TestBStrct>());
}

LayoutKind.Sequential 表示 字段(Fields)在内存中按照声明的顺序依次排列,不会被运行时(CLR)自动重新排序。
适用场景:
与非托管代码交互(如 P/Invoke、DirectX、COM)。
确保结构体的内存布局与 C/C++ 结构体一致。
Pack 指定 结构体的对齐方式(Alignment),即字段在内存中的存储是否按 n 字节对齐。
n 必须是 1、2、4、8、16 等 2 的幂次方值。
默认 Pack = 0(在 32 位系统通常是 4,64 位系统通常是 8)。
何时使用 Pack?
与非托管代码交互(如 C/C++ 结构体):
如果 C++ 端使用了 #pragma pack(4),C# 端也要用 Pack=4 确保内存布局一致。
优化内存占用:
如果结构体需要紧凑存储(如网络传输),可以用 Pack=1 减少填充。
性能优化:
某些 CPU 访问对齐的数据更快(如 Pack=8 适用于 64 位系统)。
#####
愿你一寸一寸地攻城略地,一点一点地焕然一新
#####

浙公网安备 33010602011771号