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 位系统)。

posted @ 2025-04-19 16:08  JohnYang819  阅读(105)  评论(0)    收藏  举报