У меня есть Int64, содержащий два Int32, как это:
[StructLayout(LayoutKind.Explicit)]
public struct PackedInt64
{
[FieldOffset(0)]
public Int64 All;
[FieldOffset(0)]
public Int32 First;
[FieldOffset(4)]
public Int32 Second;
}
Теперь мне нужны конструкторы (для всех, первый и второй). Однако для структуры требуется, чтобы все поля были назначены до выхода из конструктора. Рассмотрим все конструктор.
public PackedInt64(Int64 all)
{
this.First = 0;
this.Second = 0;
Thread.MemoryBarrier();
this.All = all;
}
Я хочу быть абсолютно уверенным, что this.All
назначается последним в конструкторе, так что половина поля или более не перезаписывается в случае некоторой оптимизации компилятора или переупорядочения команд в процессоре.
Является ли Thread.MemoryBarrier()
достаточным? Это лучший вариант?