c# 在 8 字节边界上对齐双精度
c# align double on 8-byte boundary
这不是一个重复的问题。
在现代 Intel CPU 中,使用 x64
构建的 8 字节边界上的 double
可以 read/write 而无需锁定,因为它保证是原子的.是否有装饰器,或者如何告诉 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 的记录选项。
您可以使用 [FieldOffset] attribute 将字段放置在任意偏移处。请注意该 MSDN 文章中的示例,需要 [StructLayout(LayoutKind.Explicit)]。
但这对你一点帮助都没有,double 的对齐已经是 8。你做不到 "better"。最重要的是对象本身如何对齐。这取决于目标平台。
当您以 x86 为目标,从而获得 32 位机器代码时,您从 GC 堆和堆栈获得的对齐仅为 4。因此您有 50% 的几率双打未对齐。如果对象分配在大对象堆中,您只能做得更好,它与 8 对齐。这需要将对象存储在至少 85,000 字节的数组中。 double[] 数组的特殊规则,当它们至少有 1000 个元素时,它们在 LOH 中分配。
如果您在 64 位 OS 上以 x64 为目标,只需在项目的“属性”>“构建”选项卡中删除抖动强制并保留 AnyCPU 即可实现,那么对象保证与 8 对齐。这是操纵大量双打时,你应该始终瞄准什么。
这不是一个重复的问题。
在现代 Intel CPU 中,使用 x64
构建的 8 字节边界上的 double
可以 read/write 而无需锁定,因为它保证是原子的.是否有装饰器,或者如何告诉 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 的记录选项。
您可以使用 [FieldOffset] attribute 将字段放置在任意偏移处。请注意该 MSDN 文章中的示例,需要 [StructLayout(LayoutKind.Explicit)]。
但这对你一点帮助都没有,double 的对齐已经是 8。你做不到 "better"。最重要的是对象本身如何对齐。这取决于目标平台。
当您以 x86 为目标,从而获得 32 位机器代码时,您从 GC 堆和堆栈获得的对齐仅为 4。因此您有 50% 的几率双打未对齐。如果对象分配在大对象堆中,您只能做得更好,它与 8 对齐。这需要将对象存储在至少 85,000 字节的数组中。 double[] 数组的特殊规则,当它们至少有 1000 个元素时,它们在 LOH 中分配。
如果您在 64 位 OS 上以 x64 为目标,只需在项目的“属性”>“构建”选项卡中删除抖动强制并保留 AnyCPU 即可实现,那么对象保证与 8 对齐。这是操纵大量双打时,你应该始终瞄准什么。