公共语言基础结构(ECMA-335)对对齐进行了以下限制:
12.6.2对齐
内置数据类型应正确对齐,定义如下:
- 当1字节,2字节和4字节数据分别存储在1字节,2字节或4字节边界时,它们会正确对齐.
- 当8字节数据存储在底层硬件所需的相同边界上时,8字节数据正确对齐,以便对原生int进行原子访问.
因此,int16和unsigned int16在偶数地址上开始; int32,unsigned int32和float32 start在一个可被4整除的地址上; 和int64,unsigned int64和float64在可被4或8整除的地址上启动,具体取决于目标体系结构.本机大小类型(native int,native unsigned int和&)总是自然对齐(4个字节或8个字节,具体取决于体系结构).在外部生成时,这些也应该与它们的自然大小对齐,尽管可移植代码可以使用8字节对齐来保证架构独立性.强烈建议float64在8字节边界上对齐,即使native int的大小是32位也是如此.
CLI还指定您可以使用unaligned前缀来允许进行对齐.此外,无论实际对齐如何,JIT都必须生成正确的读写代码.
此外,CLI允许显式布局类字段:
explicitlayout:标记的类explicitlayout使加载程序忽略字段序列并使用提供的显式布局规则,以字段偏移和/或整体类大小或对齐的形式.在分区II中指定的有效布局有限制....
可选地,开发者可以指定类的包装大小.这是不经常使用的布局信息,但它允许开发人员控制字段的对齐.它本身不是对齐规范,而是用作在所有对齐上设置上限的修改器.典型值为1,2,4,8或16.不应标记通用类型
explicitlayout.