C++ では、ライブラリはヘッダーのみの形式で配布できます。すべてのライブラリをヘッダーのみのライブラリに変換できるかどうか疑問に思っていますか? それともその逆?また、ヘッダーのみでライブラリを配布する必要があるかどうかを判断するには、どのような基準を使用する必要がありますか? ヘッダーのみのライブラリを再コンパイルする必要がある以外に、決定に影響を与える可能性のある考慮事項はありますか? ここでヘッダーのみのライブラリで「インライン」がどのように重要な役割を果たしますか?
ありがとう、
C++ では、ライブラリはヘッダーのみの形式で配布できます。すべてのライブラリをヘッダーのみのライブラリに変換できるかどうか疑問に思っていますか? それともその逆?また、ヘッダーのみでライブラリを配布する必要があるかどうかを判断するには、どのような基準を使用する必要がありますか? ヘッダーのみのライブラリを再コンパイルする必要がある以外に、決定に影響を与える可能性のある考慮事項はありますか? ここでヘッダーのみのライブラリで「インライン」がどのように重要な役割を果たしますか?
ありがとう、
一般に、ヘッダーの内容はすべてインラインと見なされます。これは一部のライブラリにとっては好ましいことですが、一般的には十分に考慮して使用する必要があります。ヘッダーにあまりにも多くのロジックを配置すると、クライアント コードの相互依存、ロジックが変更された場合の長いコンパイル時間、インラインの使いすぎによるコードの肥大化など、いくつかの望ましくない結果が生じる可能性があります。これらの問題のいくつかは、優れた最適化コンパイラで軽減できます。一般に、複雑なロジックをインライン関数、つまりヘッダー ファイルに配置しないことをお勧めします。これは、これらの問題の大部分の原因となるためです。
逆に言えば、はい、ヘッダーとして配布されているほとんどのライブラリは、より伝統的なライブラリに変換できます。これに対する例外は、テンプレート化されたコードに大きく依存しているライブラリです。これは通常、コンパイル時に解釈されるためです。
基準に関しては、コードが頻繁にテンプレート化されている場合、および/または主に単純な関数で構成されている場合は、ヘッダー ライブラリが受け入れられる選択肢になると思います。それ以外の場合は、通常のライブラリがほぼ間違いなくより良い選択です。
要するに、すべてのソース コードをリリースすることに問題がなければ、そうです。
しかし、他にも多くのことがあります。たとえば、ライブラリの更新が配布された場合、動的にリンクされたライブラリは最新バージョンを使用しますが、ヘッダーのみを再コンパイルする必要があります。また、他の大きな違いはコードの最適化です。コンパイラがソースにアクセスできる場合、特定の状況に対してより優れたアセンブリを生成できます。
最後になりましたが、動的リンクを使用すると、ライブラリ ディレクトリにインストールする必要がありますが、ヘッダーのみを使用すると、プログラムを独立させることができます。
ヘッダーのみに変換できるかどうかは、ライブラリに依存します。逆に、任意のライブラリをヘッダーのみから従来のヘッダー + ソースに変換できます。なぜヘッダーのみが必要なのか、本当に自問したいですか?何を獲得または達成したいと考えていますか?
ライブラリをヘッダーのみとして配布すると、ライブラリの変更に関して問題が発生する可能性があります。インターフェイスを変更しない小さな変更があるとしましょう。ライブラリを再コンパイルする代わりに、それを使用するすべてのアプリケーションを再コンパイルする必要があります。スタティック ライブラリを使用すると、ユーザー アプリケーションを再リンクするだけで済みます。共有ライブラリを使用すると、再コンパイルまたは再リンクする必要がありません。
また、ライブラリ オブジェクトを相互に通信するために、ライブラリを使用するすべてのコンポーネントが同じコンパイラとリンカー バージョンを使用し、同様にビルドする必要がある (つまり、同じ CRT リンケージ、最適化など) という問題に遭遇する可能性もあります。しかし、これは、特定の設計上の選択によって大部分が処理される可能性があります。
「インライン」に関しては、基本的にすべてがヘッダーのみのライブラリでインライン化されています。