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

c#在8字节边界上对齐双精度,c#,thread-safety,alignment,atomic,C#,Thread Safety,Alignment,Atomic,这不是一个重复的问题 在现代Intel CPU中,使用x64构建的8字节边界上的double可以在不锁定的情况下读/写,因为它保证是原子的。是否有装饰程序,或者如何告诉C#编译器在8字节边界上对齐 下面[Align(8)]装饰符的实际代码是什么 public class AClass { [Align(8)] private static double d1; [Align(8)] private static double d2 //and so on

这不是一个重复的问题

在现代Intel CPU中,使用
x64
构建的8字节边界上的
double
可以在不锁定的情况下读/写,因为它保证是原子的。是否有装饰程序,或者如何告诉C#编译器在8字节边界上对齐

下面[Align(8)]装饰符的实际代码是什么

public class AClass
{
    [Align(8)]
    private static double d1;
    [Align(8)]
    private static double d2
    //and so on
}

所有Windows堆分配都已在8字节边界上对齐,类型自然对齐。如果出于某种原因需要更改此选项,Visual C#可能支持
#pragma pack
,但它似乎不是MSVC'15的文档化选项。

您可以使用。请注意MSDN文章中的示例,[StructLayout(LayoutKind.Explicit)]是必需的

但这对你一点帮助都没有,双精度的校准已经是8了。你不能让它“更好”。最重要的是对象本身如何对齐。这取决于目标平台

当您以x86为目标,从而获得32位机器代码时,从GC堆和堆栈获得的对齐度仅为4。所以你有50%的几率认为双打不对位。如果对象是在大对象堆中分配的,那么您只能做得更好,它与8对齐。这需要将对象存储在至少85000字节的数组中。double[]数组的一个特殊规则是,当它们至少有1000个元素时,会在LOH中分配它们


如果您将64位操作系统上的x64作为目标,只需删除项目的“属性”>“构建”选项卡中的抖动强制并保留AnyCPU即可实现,那么对象将保证与8对齐。这是你在操纵很多双打时应该始终瞄准的目标。

我问的是一个具体问题,可能是重复的。如何告诉编译器在8字节边界上对齐一个变量?谢谢,在这个线程中,除非我读错了,否则它似乎需要使用x64而不是任何CPU构建?“…因此您需要为x64构建程序集(而不是任何CPU)…”不,使用AnyCPU。也就是说,如果你在64位操作系统上运行,你就会得到一个64位进程。它仍然可以在32位操作系统上工作。只有在绝对不希望程序在32位操作系统上运行时,才能选择x64。