填充一个结构,使其大小是 16 字节的倍数
Pad a struct so its size is a multiple of 16 bytes
我试图让我的 C# 结构匹配一些复杂的 padding and packing rules。
- 字段应按 4 字节边界对齐。
- 整个结构应该是 16 字节的倍数
使用 StructLayout 属性我可以确保字段在 4 字节边界上对齐。
[StructLayout(LayoutKind.Sequential, Pack=4)]
struct Foo
{
float a;
float b;
}
但是查看 StructLayout 属性的其他选项,我看不到将结构填充为 16 字节的倍数的选项。在 C# 中没有选项吗?
我看到的唯一选项是使用 StructLayout 属性的 Size 属性 手动设置正确的大小。但这对我来说似乎很脆弱。因为每次有人向这个结构添加一个字段时,他们应该注意不要忘记更新大小。
经过更多搜索,看起来我确实必须手动设置 Size 和 FieldOffset 才能在 DirectX/HLSL/C# 互操作代码中获得常量缓冲区的正确打包规则。
在我自己的项目中,这甚至有点复杂。因为我使用源代码生成器来创建这些结构。但最终我还是弄明白了。对于那些感兴趣的人,可以找到源代码 here.
我试图让我的 C# 结构匹配一些复杂的 padding and packing rules。
- 字段应按 4 字节边界对齐。
- 整个结构应该是 16 字节的倍数
使用 StructLayout 属性我可以确保字段在 4 字节边界上对齐。
[StructLayout(LayoutKind.Sequential, Pack=4)]
struct Foo
{
float a;
float b;
}
但是查看 StructLayout 属性的其他选项,我看不到将结构填充为 16 字节的倍数的选项。在 C# 中没有选项吗?
我看到的唯一选项是使用 StructLayout 属性的 Size 属性 手动设置正确的大小。但这对我来说似乎很脆弱。因为每次有人向这个结构添加一个字段时,他们应该注意不要忘记更新大小。
经过更多搜索,看起来我确实必须手动设置 Size 和 FieldOffset 才能在 DirectX/HLSL/C# 互操作代码中获得常量缓冲区的正确打包规则。
在我自己的项目中,这甚至有点复杂。因为我使用源代码生成器来创建这些结构。但最终我还是弄明白了。对于那些感兴趣的人,可以找到源代码 here.