2011-08-12 7 views
5

私は、画像操作を実装するパフォーマンス重視のアプリケーションを作成しています。私はいくつかの処理を行うPixelという名前の私の構造体を使用していくつかのピクセルポインタを使用しています。コード全体を繰り返し処理するコード部分がたくさんあります。コードの再利用性とモジュール性のために、私はアクションを取ってイメージのすべてのピクセルに適用するメソッドを設計しています(マップ関数)。しかし、私がAction<Pixel*>と書くと、Visual Studioはコードについて、タイプPixel*がタイプ引数として使用されないかもしれないと言っています。クラス全体がunsafeコンテキスト内にあり、どこでもポインタがPixel個使用されていますが、ピクセルポインタをアクションのテンプレートクラスとして使用することはできません。アクション<PointerClass *>を引数として使用

私はAction<IntPtr>を使用することができますが、私は「パフォーマンスクリティカル」であることの全体的なアイデアを殺すEVERY反復におけるメソッド本体内の適切なポインタに変換する必要があります。

+0

正確なエラーメッセージ? –

+0

'タイプ 'Tools.Imaging.Pixel *'は型引数として使用できません。 ' –

+0

なぜ' Action ' –

答えて

8

Action<T>を使用することは強制されていないようですので、独自のデリゲートタイプを作成することができます。私は一般的な方法でこれを行う方法を把握していないが、これは動作します:

unsafe delegate void PixelAction(Pixel* ptr); 

が、これは本当に重要なパフォーマンスである場合には、デリゲートを呼び出すことがちょうど直接メソッドを呼び出すよりも低速であることに注意してください。コンパイル時またはReflection.EmitまたはCodeDOMを使用して実行時にコードを複製する(あなたのケースで動作する場合)、またはコード生成のような、別の方法が良いかもしれません。

+0

はい。この答えは私に同じ考えをさせました:) 'Action'sを使って作業することで、私は正規の代議員を完全に忘れてしまいました。私はこれを実装しようとしています。 –

1

ポインタ型はクラスではないため、汎用型引数として使用することはできません。

あなたの唯一のアプローチは、アクション<IntPtr>を定義し、必要に応じて両側にキャストすることです。私は、パフォーマンスのヒットが、最適化でコンパイルするときに思いつくほど悪くないとは思わない。

EDITは:(CS0208)

いずれも動作しません下記判明し、またはその代わりに定めるT >アクション<を使用してのそれは、独自のデリゲート型はうまくいくかもしれない:

delegate void PointerAction<T>(T* ptr); 

+1

これはうまくいかないようです。「ポインタと固定サイズのバッファは、安全でないコンテキストでのみ使用できます。 'unsafe'を追加すると、「アドレスを取得したり、サイズを取得したり、ポインタを管理型( 'T')に宣言することはできません。 – svick

関連する問題