3

これが可能かどうかはわかりません.C#でのマーシャリングについてはよくわかりません.

しかし、基本的には、C# ベースのアプリで、C# にフロートの配列があります。このプログラムが循環するたびに、この float の配列に対して非常にプロセッサを集中的に使用する重労働を行う必要があります。だから私はこのプロセッサの重いコードを C で書き、float の配列を C にマーシャリングし、C での編集を処理したいと考えました。 Cで編集されたもの。

私が遭遇した問題は、マーシャリングのオーバーヘッドです。パフォーマンスの向上は、マーシャリングの過程で失われます。この float の配列を C# から C にマーシャリングし、このプログラムのサイクルごとに C から C# に戻す必要がある場合、パフォーマンスは向上しません。

float の配列を作成し、この配列へのポインターを C にマーシャリングして、C で配列を編集する方法はありますか?また、C# から同じ正確なポインターを使用して、配列をすぐに参照し、何を確認することもできます。配列内の C コードが変更されましたか? それでは、サイクルごとに配列をマーシャリングする必要はありませんか?

4

1 に答える 1

0

固定ブロックを使用できます。これにより、ガベージ コレクターがメモリ内の配列を移動できなくなります。結果として、使用できるマネージド配列への生のポインターを取得します。生のポインターを C コードに渡します。コピーは必要ありません。C コードはマネージド アレイで直接動作します。固定ブロックが範囲外になったら、生のポインターを保持しないでください。そうしないと、GC の実行後に不良ポインターを保持している可能性があります。

例:

int[] arr;
// NOT SHOWN:  initialize arr array
fixed (int* p = arr) {
    // NOT SHOWN:  call C function, passing "p" pointer
}
于 2012-08-06T21:30:37.013 に答える