3

私たちのプロジェクトには 3 つのモジュールがあります。C++ (ネイティブ)、C++/CLI、C#。C++/CLI を使用して、C# で C++(ネイティブ) コードを使用しています。このために、C++ (ネイティブ) を C++/CLI と静的にリンクしており、C# で C++/CLI マネージド dll を使用できるようになりました。

現在、C++ (ネイティブ) のコードは単純な数学アルゴリズムです (Win32 なし、OS との対話なし)。static lib を C++/CLI にリンクするとマネージ コードにならないのですか? CLRに該当しないことを意味します。

C# の C++/CLI で C++ (ネイティブ) 静的ライブラリを使用すると、パフォーマンスが向上しますか? ネイティブ コードではなく、C# 自体でコードを記述できませんか。

C++ (ネイティブ) コードでは、標準 C++ ライブラリのアルゴリズム、コンテナ、イテレータを広範囲に使用しています。

ありがとう。

4

1 に答える 1

8

static lib を C++/CLI にリンクするとマネージ コードにならないのですか? CLRに該当しないことを意味します。

いいえ、必ずしもそうではありません。C++/CLI では、すべてのマネージド型が MSIL にコンパイルされ、コードは CLR で実行されます。ネイティブ型は、コンパイラ オプションに応じて、MSIL またはネイティブ マシン コードにコンパイルされます。

  • この/clrオプションでは、ネイティブ コードとマネージ コードが混在して生成されます。
  • この/clr:pureオプションは、MSIL にコンパイルされたネイティブ型を含むことができるマネージのみのアセンブリを生成します。これは基本的に、オプションでコンパイルされた C# コードと同じように機能し/unsafeます。
  • この/clr:safeオプションは、ネイティブ コードを含まないマネージのみのアセンブリを生成します。これは基本的に、オプションなしでコンパイルされた C# コードのように機能し/unsafeます。

C# の C++/CLI で C++ (ネイティブ) 静的ライブラリを使用すると、パフォーマンスが向上しますか? ネイティブ コードではなく、C# 自体でコードを記述できませんか。

すべての最適化の質問と同様に、答えは依存するということです。一方では、ネイティブ コードはマネージ コードよりも高速であることが多く、より高度に最適化できます (SIMD の使用など)。一方、混合モードのアセンブリに関連するパフォーマンス ヒットがあります。通常、C++ 相互運用機能の実装は非常に高速です (C# の P/Invoke よりもはるかに高速です) が、ネイティブ コードへのコンパイルから得られる利点が十分でない場合は、それでも価値がない可能性があります。実際に知る唯一の方法は、2 つのオプションをテストすることです。

マネージ コードは、特にベテランの C++ プログラマーからよく悪口を言われますが、実際には、適切に作成された C# コードは、同等のネイティブ C++ コードよりも高速ではないにしても、同じくらい高速です。また、C++ で自分自身を撃つことははるかに簡単です。そのため、C# の専門家であり、必ずしも C++ の専門家ではない開発者のチームを持っている場合、不十分に作成された遅い C++ コードになる可能性があります。最後に、プロジェクトの残りの部分がすべて C# である場合、メンテナンス コストが削減されるため、同等のパフォーマンスでも許容できる場合があります。

于 2013-08-01T11:01:34.647 に答える