c#在8字节边界上对齐双精度
本文关键字:对齐 双精度 边界 字节 | 更新日期: 2023-09-27 18:12:16
这不是一个重复问题。
在现代Intel CPU中,double
在由x64
构建的8字节边界上可以不加锁地读/写,因为它保证是原子的。是否有一个装饰器,或者我如何告诉c#编译器在8字节边界上对齐。
下面的[Align(8)]装饰器的实际代码是什么?
public class AClass
{
[Align(8)]
private static double d1;
[Align(8)]
private static double d2
//and so on
}
您可以使用[FieldOffset]属性将字段放置在任意偏移量处。注意MSDN文章中的例子,[StructLayout(LayoutKind.Explicit)]是必需的。
但是这对你没有任何帮助,double的对齐已经是8了。你不能让它变得"更好"。最重要的是对象本身如何对齐。这取决于目标平台。
当您的目标是x86,从而获得32位机器码时,您从GC堆和堆栈中获得的对齐仅为4。所以你有50%的几率双子星没有对齐。只有在大对象堆中分配对象才能做得更好,它被对齐为8。这需要将对象存储在至少85,000字节的数组中。双[]数组的一个特殊规则,当它们至少有1000个元素时,它们在LOH中被分配。
如果您的目标是64位操作系统上的x64,通过简单地删除抖动强迫在您的项目的属性>构建选项卡和保持AnyCPU实现,然后对象保证对齐到8。这是在操作大量双精度数时应该始终瞄准的目标。
所有Windows堆分配已经在8字节边界上对齐,并且类型是自然对齐的。如果你出于某种原因需要改变这一点,Visual c# 可能支持#pragma pack
,但它似乎不是MSVC ' 15的文档选项。