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
}

c#在8字节边界上对齐双精度

您可以使用[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的文档选项。