次のような 2 つの Int32 を含む Int64 があります。
[StructLayout(LayoutKind.Explicit)]
public struct PackedInt64
{
[FieldOffset(0)]
public Int64 All;
[FieldOffset(0)]
public Int32 First;
[FieldOffset(4)]
public Int32 Second;
}
ここで、コンストラクターが必要です ( all、first 、および second用)。ただし、構造体では、コンストラクターを終了する前にすべてのフィールドを割り当てる必要があります。allコンストラクターを考えてみましょう。
public PackedInt64(Int64 all)
{
this.First = 0;
this.Second = 0;
Thread.MemoryBarrier();
this.All = all;
}
コンストラクターで最後に割り当てられていることを絶対に確認してthis.All
、コンパイラーの最適化や CPU での命令の並べ替えが発生した場合にフィールドの半分以上が上書きされないようにする必要があります。
Thread.MemoryBarrier()
十分ですか?それは最良の選択肢ですか?