5

私は VC++ を学んでいますが、なぜエンドユーザーも MSVC++ を必要とするのでしょうか?

MSDN で確認できる限り、私のプログラムが使用するすべてのライブラリ (実際の DLL ファイル) は、システム自体 (user32.dll、kernel32.dll など) に既に付属しています。

しかし、なぜペイントとメモ帳は MSVC++ を必要としないのに、メモ帳よりも単純な私のソフトウェアはこのランタイムを必要とするのでしょうか? ランタイムは何をしますか? それはどのように機能しますか?MSVC++ なしでソフトウェアを動作させる方法はありますか?

4

2 に答える 2

8

ランタイムは、 や などのすべての標準関数とクラス、std::stringおよびstd::vectorグローバル オブジェクトのコンストラクタとデストラクタを実行するサポート コード、例外ハンドラの検索などを提供します。Windows にはこれらすべてのバージョンが付属しており、しばらくの間 Visual C++ が使用されていました。しかし、標準との非互換性があることが発見されたため、新しいバージョンのコンパイラには修正が含まれています (既存のプログラムが破損するため、Windows は古い DLL の代わりに新しい修正をバンドルすることはできません)。

はい、ランタイム再配布可能インストーラーの必要性を避けることができます。/MT必要なすべてのライブラリ関数を実行可能ファイルに直接バンドルするビルド オプションを使用できます。その後は、Windows に付属の DLL のみが必要になります。

設定は、C/C++ -> コード生成 -> ランタイム ライブラリのプロジェクト構成にあります。

ただし、これにより実行可能ファイルが多少大きくなり、特定の実装が組み込まれているため、バグ修正 (特に Windows Update を介して配布されるセキュリティ修正) がプログラムに影響を与えないことに注意してください。

于 2012-07-10T01:44:17.173 に答える
2

ベンの答えに追加:

ランタイムには、Visual Studio の各バージョンの多くの機能がバンドルされています。ランタイムの DLL バージョンを使用する主な利点は、システムが問題の DLL を更新するたびに (セキュリティ) 更新を「無料で」入手できることです。

一部の人々が指摘するもう 1 つの利点は、多くのプロセスが DLL 経由でランタイムを使用する場合、DLL バージョンを使用するためのリソースを節約できることです。これは、Windows には、メモリ内の DLL をプロセス間 (またはプロセスの大部分) で共有するメカニズムがあるためです。

ランタイムをバイナリにバンドルする (静的リンクとも呼ばれる) と、バイナリが大きくなることに気付くでしょう。これは、各バイナリが独自のバージョンのランタイムを保持するためです (プログラムを新たにリンクしないと置き換えられません)。

また、ランタイムの異なるバージョン (つまり、デバッグとリリース) に静的にリンクする (つまり、デバッグとリリース) DLL や、DLL に応じてランタイムに動的かつ静的にリンクする (独自の) DLL を混在させることにも注意してください。ここでの問題はアロケーターです。メモリを割り当てる関数 ( malloccallocnew) とメモリを解放する関数は、これらの間で互換性がありません。このような場合の最善の方法は、 - などの独立したメカニズムを使用するIMallocか、オブジェクト インスタンス内に常にデアロケータを保持し、インスタンスが別のモジュールで処理されている場合でも、 free/への呼び出しがdeleteモジュールの境界を越えないようにすることです。

于 2012-07-10T01:55:07.340 に答える