2

C++静的ライブラリとダイナミックライブラリに関する質問があります。ここでプログラムを開発していて、1つの機能がC++ライブラリにあるとします。次に、2つの選択肢があります。1つは、いくつかのコードを記述し(多すぎないと仮定)、関数を再実装することです。もう1つは、C++ライブラリから関数を呼び出すことです。ただし、使用するC ++ライブラリは非常に大きいものですが、ライブラリのごく一部しか使用していません。この場合、より良い選択は何ですか?ありがとう!

4

6 に答える 6

6
  • 静的ライブラリリンクは、実行可能ファイルを効果的に使用するシンボルにのみリンクします。libに200個の関数があり、4つだけを使用するとします(libの内部呼び出しを含む)。使用した4つのシンボルのみが実行可能ファイルにリンクされます。したがって、2Mb libとリンクすると、実行可能ファイルに20kしか追加されない場合があります。

  • ウィンドウの下のダイナミックライブラリはシンボルが完全である必要があります。つまり、DLLには200個のシンボルが含まれ、必要なのは4個だけですが、実行可能ファイルのサイズに大きな影響はありません(DLLとのリンクに使用されるライブラリはシンボルフォワーダ)、ロード時間とメモリフットプリントに影響を与える可能性があります。

于 2012-08-08T13:24:12.013 に答える
3

誰かがここで「正しい」答えを出すことができるかどうかはわかりません。個人的な選択のようなものだと思います。

ライブラリが本当に大きく、必要な場合、たとえば2〜3個の関数が必要な場合は、ライブラリの使用を完全に避けて実装します(または、ライセンスで許可されている場合は、実装をコピーします)。

たとえば、文字列を何らかの方法で解析するための関数が何度か必要でした。Boostにはそのような機能があります。しかし、2〜3個の関数、20〜50行のコードがあるという理由だけで、プロジェクトのBoostに依存関係を追加したくありませんでした。自分で再実装しただけです。

しかし、すでに述べたように、それは個人的な選択のようなものです。または、制限がある場合は、制限によって異なります。


編集:注:「車輪の再発明」をする必要はありません。このライブラリから多くのものが必要な場合は、それを使用してください!すでに存在するものを実装しようとしないでください(他のユーザーによってすでにテストされ、使用されているため)。特にそれが複雑な場合。

于 2012-08-08T13:21:05.980 に答える
2

ライブラリを使用します。コンパイルのオーバーヘッドがすべて問題になる場合(ほとんどのプロジェクトでは問題になりません)、ライブラリを再実装するのは簡単です。今のところ、余分なコードを書くために時間を費やす必要はありませんが、を投入する#include方がはるかに高速で、心配も少なくなります。

于 2012-08-08T13:19:03.963 に答える
1

ライブラリが、デプロイするシステムにすでにインストールされている共有ライブラリである場合、リンクと実行時の両方の観点から、ライブラリを使用する際のオーバーヘッドはごくわずかです。

ただし、問題のライブラリをデプロイする必要がある場合は、静的リンクの可能性を調査する価値があるかもしれません。

どちらの場合も、使用する機能の独自の実装を作成するよりも望ましい方法です。ライブラリバージョンは証明されていますが、おそらくそうではありません。

于 2012-08-08T13:23:13.083 に答える
1

これは非常に主観的なものであり、多くの要因が文書化していない役割を果たします。のように:あなたは今から10年後もこのプログラムをサポートするつもりですか?これは、最近のC++コードではほぼ確実です。ライブラリのメンテナンスリリースに簡単に追いつくことができず、そのコードをコピーして貼り付けることができなくなったことを後悔する可能性があります。注意深く文書化しないと、いつかメンテナンスを引き継ぐ人は間違いなくこれを楽しむことができません。あなたがしたこと。

次に、時期尚早の最適化の角度があります。Windowsにロードされた実行可能イメージは、必要なリソースが非常に少ないです。「大規模な」ライブラリは、たとえば10メガバイトのコードです。これは、32ビットプロセスの仮想メモリアドレス空間の0.5%です。仮想に焦点を当てると、使用しないコードにお金を払う必要はありません。デマンドページングオペレーティングシステムの非常に優れた利点。ライブラリのハッキングにかなりの時間を費やし、そうすることの測定可能な利点が小さいときに何をしたかを文書化することを正当化することはかなり困難です。あなただけがその費用便益分析を行うことができます。

于 2012-08-08T13:40:40.320 に答える
0

そのライブラリのインクルードファイルが非常に大きい場合は、前方宣言を使用します。

リンクが問題である場合は、共有ライブラリを検討してください(おそらく開発のためだけに)。

リンクが問題であり、それらの関数が些細なものである場合は、おそらく自分でコーディングすることを検討してください。

それ以外の場合は、ヒットしてください。

于 2012-08-08T13:24:00.727 に答える