ネイティブ クラスのマネージド オブジェクトへの参照を保持するために gcroot が使用されることは知っていますが、マネージド オブジェクトをアンマネージド クラス関数内のローカル変数として使用する場合はどうでしょうか。コンパイラはこれでエラーを生成していないようですが、「適切」ですか? パフォーマンスに影響はありますか?
2 に答える
マネージド オブジェクト (マネージド値型の値 ( value struct
、value class
、enum class
) とマネージド参照型へのハンドル( ref struct
、 ) の両方ref class
) は、MSIL にコンパイルされるコード内で使用できます。
また、MSIL にコンパイルされるコードは、アンマネージ オブジェクトの一部である可能性があります (たとえば、標準 C++ 型の仮想メンバー関数を MSIL にコンパイルでき、Visual C++ コンパイラの "It Just Works" テクノロジにより、v-テーブルが正しく設定されている)。これは、標準 C++ コードによって生成されたイベントとコールバックをマネージ GUI ワールドに転送する場合に非常に便利です。ただし、C++ から呼び出したいマネージ コード (おそらく C#) にアルゴリズムが実装されている場合にも適用できます。
Hans が言及しているように、特定の機能について MSIL とマシン コード生成を切り替えると、パフォーマンスに影響があります。ただし、ネイティブ管理の境界に座っている場合は、MSIL にコンパイルし、「It Just Works」または「C++ 相互運用」を使用することが、最高のパフォーマンスの代替手段です。