0

私は現在構造体を読んでいて、属性で使用されている構造体の例に出くわしました。この例では、使用されている struct 属性は[FieldOffset(0)]、フィールドが同じメモリに格納されていることを確認するものです。

これの利点または欠点は何ですか? FieldOffsetAttributeまた、フィールドをメモリの異なる部分に配置するために使用したいのはなぜですか?

4

2 に答える 2

2

これは、構造体のメンバーのメモリ内の正確なオフセットを制御するために使用されます。P/Invoke呼び出しのコンテキストでネイティブ (C++) 構造体を表現する場合に、C# で使用されることがあります。

C# には構造体共用体などがないため、 を使用する必要がありますFieldOffsetValueAttribute

次の記事を読むことをお勧めします。

于 2012-07-11T09:37:11.330 に答える
1

このトリックがどこかで使用されているのを見たことがあります。これにより、配列の要素をコピーせずに、配列の基になる型が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()など)には、ある種のメモリコピーが含まれ、大きな配列では問題になる可能性があります。

于 2012-07-11T09:55:47.790 に答える