私は現在構造体を読んでいて、属性で使用されている構造体の例に出くわしました。この例では、使用されている struct 属性は[FieldOffset(0)]
、フィールドが同じメモリに格納されていることを確認するものです。
これの利点または欠点は何ですか? FieldOffsetAttribute
また、フィールドをメモリの異なる部分に配置するために使用したいのはなぜですか?
私は現在構造体を読んでいて、属性で使用されている構造体の例に出くわしました。この例では、使用されている struct 属性は[FieldOffset(0)]
、フィールドが同じメモリに格納されていることを確認するものです。
これの利点または欠点は何ですか? FieldOffsetAttribute
また、フィールドをメモリの異なる部分に配置するために使用したいのはなぜですか?
このトリックがどこかで使用されているのを見たことがあります。これにより、配列の要素をコピーせずに、配列の基になる型がuintからintに変更されます。
[StructLayout(LayoutKind.Explicit)]
struct ArrayTypeChanger
{
[FieldOffset(0)]
public int[] ArrayOfInts;
[FieldOffset(0)]
public uint[] ArrayOfUInts;
}
そしてどこかでタイプ変更方法:
public static int[] ChangeArayType(uint[] input)
{
return new ArrayTypeChanger { ArrayOfUInts = input }.ArrayOfInts;
}
メモリはコピーされないため、非常に高速になります。もちろん、型が同じサイズの場合にのみ機能します(sizeof(uint)== sizeof(int))。MSがこれを推奨するかどうかわからない...
このような配列のタイプを変更する他の方法(Marshal.Copy()など)には、ある種のメモリコピーが含まれ、大きな配列では問題になる可能性があります。