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