3

アンマネージ PInvoke シナリオで System.Numerics.Complex を使用したいと考えています。ILSpy を使用して、LayoutKind.Sequential 属性が割り当てられていないことに気付きました。

/// <summary>Represents a complex number.</summary>
[Serializable]
public struct Complex : IEquatable<Complex>, IFormattable
{
    private double m_real;
    private double m_imaginary;
    ...

共通メモリ レイアウトを期待するネイティブ関数に変換せずに、Complex[] 配列へのポインターを与えることは安全ですか? それとも、何らかの理由で CLR がその実数と虚数の属性を乱す可能性はありますか?

4

2 に答える 2

1

LayoutKind.Sequentialは、すべての主要な.NETコンパイラのデフォルトです:http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.layoutkind.aspx

そうでない場合でも、属性の順序を変更する唯一の理由は、配置の問題です。System.Numerics.Complexには2つのdoubleメンバーしかないため、それらを交換する理由はありません。だからIMOあなたは安全です。

于 2012-04-05T18:22:32.257 に答える
1

これはstructであるため、問題ありません。シーケンシャルな暗黙の [StructLayout] があります。typeof(Complex).IsLayoutSequential からわかること。同じことはクラスには当てはまりません。明示的な宣言が必要です。

はい、フィールドはオブジェクトの内部表現で交換できます。しかし、pinvoke マーシャラーはオブジェクトをマーシャリングする必要があるため、それは問題ではありません。マーシャラーには暗黙の Marshal.StructureToPtr() が組み込まれています。2 つの double のパッキングが既に最適化されているため、このスワッピングは発生しません。パディングを残さずにフィットします。したがって、マーシャラーはオブジェクトへのポインターを作成するだけで、それをコピーする必要はありません。

すべての良いニュース:)

于 2012-04-05T18:37:15.590 に答える