2

したがって、パフォーマンスについて話すときによく聞かれるコメントの1つは、どの言語でもコードを記述して、作業を最速で実行できるというものです。特定の領域でのパフォーマンスが問題になる場合は、それらのビットをC /C++で書き直してください。

しかし、ネイティブC++アプリから始めている場合はどうでしょうか。Python、Ruby、C#などの言語で簡単なビットを記述したり、古いビットをリファクタリングしたりする場合、どのようなオプションがありますか?ネイティブ側と他の側の間でデータを転送する必要があることに注意してください。C ++クラスをデータとして渡しながら、「より簡単な」言語で記述された関数を簡単に呼び出すことができれば、すばらしいでしょう。

C#などで新しいコードをクランクアウトしたり、古いコードをリファクタリングしたりできれば、非常に役立つ無愛想なWin32アプリがあります。C ++の複雑さを必要とするものはほとんどなく、少し厄介な部分を処理することはプログラミングプロセスを引きずっています。

4

5 に答える 5

2

Aaron Fischerが提案しているように、/clrオプションをオンにしてC++アプリケーションを再コンパイルしてから、.Netプラットフォームの活用を開始してください。

CLI / C ++は、C#とC ++をすでに知っている場合は非常に簡単に理解でき、.Netの世界とネイティブのC++の間の架け橋となります。

現在のC++コードが/clrをオンにした状態で正常にコンパイルできない場合は、アプリケーションを静的ライブラリ(/ clrを有効にしない)としてビルドしてから、main()をCLI /C++プロジェクトに含めることをお勧めします。レガシーアプリのエントリポイントを呼び出します。そうすれば、少なくとも.Netを新しい機能に活用し始めることができます。

.Net CLI /C++に「移植」された「レガシー」C/C ++アプリの例については、Quake2およびQuake3:Arenaの.Netポートを確認してください。

于 2008-10-22T11:10:28.263 に答える
1

C ++とPythonの間で作業したい場合は、BoostPythonよりも探しているものです。Cython用にCPythonバインディングを手動で作成できますが、それによってコードの作成方法がさまざまに制限されます。このチュートリアルの一部のスニペットに見られるように、これが最も簡単な方法です。

hello worldを実行する単純な関数:

char const* greet()
{
   return "hello, world";
}

それをPythonに公開するために必要なBoostpythonコード:

#include <boost/python.hpp>

BOOST_PYTHON_MODULE(hello_ext)
{
    using namespace boost::python;
    def("greet", greet);
}

Pythonからこのコードを使用する方法:

>>> import hello_ext
>>> print hello.greet()
hello, world

Pythonはネイティブコードにコンパイルされないため、反対方向に進むのは少し難しいです。PythonインタープリターをC++アプリケーションに埋め込む必要がありますが、そのために必要な作業はここに記載されています。これは、Pythonインタープリターを呼び出して結果を抽出する例です(PythonインタープリターはC ++で使用するオブジェクトクラスを定義します)。

object result = eval("5 ** 2");
int five_squared = extract<int>(result);
于 2008-09-29T03:23:43.663 に答える
1

まあ、それは本当に言語に依存します。たとえば、Pythonのインターフェースは、Boost Pythonで最も簡単に実行できます。他の多くの言語では、Cライブラリを使用し、コールバックをextern "C"として宣言することで、Cと同じようにインターフェースする必要があります(残念ながら、通常、他の言語のC ++クラス定義を使用します)。

ただし、C ++は複雑な言語であるため、何に使用するのかを尋ねますが、一度慣れると、他の言語よりも非常に強力で、コーディングもそれほど難しくありません。私が考えることができる唯一の本当に良い例外は、1つの言語でのみ存在する強力なライブラリを使用することを計画していて、適切なC ++の代替手段がない場合です(グラフィックライブラリは、非常に精通している必要があるため、おそらくこれの最良の例ですそれらを効果的に使用するためにそれらと一緒に)。

また、C ++コードを別の言語にインターフェースすると、その言語によって付与されるプラットフォーム間の互換性が失われることも指摘しておく価値があります。

于 2008-09-29T03:24:10.557 に答える
1

C++ プロジェクトの共通言語ランタイム サポートを /clr に変更できます。この時点から、C++ コードで任意の .net 機能を使用できます。これには、プロジェクトでの winform の作成も含まれます。UI やその他の機能を処理する ac# ライブラリを追加することもできます。

于 2008-09-29T03:47:59.953 に答える
0

.NETの世界では、C#/VB.NETアセンブリ用にCOM/ActiveX相互運用機能レイヤーを作成するオプションが常にあります。

次に、C++アプリケーションの通常のCOMAPIを使用して、実際に.NETアセンブリをラップするこのCOMサーバーのインスタンスを作成できます。

これの良いところは、int、bool、string、floatなどの単純なパラメーターが同等のCOMにマップされることです。ただし、私の知る限り、完全な.NETオブジェクト(作成したクラスのインスタンス)を簡単に渡すことはできません。

また、COM相互運用機能の呼び出しは比較的遅いことに注意してください。タイトなループでC++コードからCOM相互運用メソッドを継続的に呼び出すべきではありません。

COM / ActiveXは伝統的にWindowsレジストリに依存してきましたが、大きな依存関係であるため理想的ではありません。ただし、この依存関係を回避するために、 Registration- FreeCOM相互運用機能を使用することもできます。

この記事では、COM相互運用機能用に.NETアセンブリを登録するために必要な手順について説明します。

于 2008-09-29T03:31:10.947 に答える