さて、最初にあなたの仮定のいくつかを破壊しましょう:
- C ++のヘッダー専用ライブラリの利点の1つは、個別にコンパイルする必要がないことです。
個別にコンパイルすると、一部のみが変更された場合にすべてを再コンパイルする必要がない可能性があります。
したがって、アドバンテージではなくデメリット。
- CおよびC ++では、関数がヘッダーファイルで定義されている場合にのみインラインが意味を持ちます*。
はい、inline
残っている唯一の効果はone-definition-ruleの例外です。
ただし、これらの定義が何らかの形で異なっている場合は、あなたに災いがあります。
したがって、関数がコンパイル単位の内部にある場合は、マークしstatic
ます。また、関数はインライン化するために使用可能である必要があるため、インライン化の可能性が高くなります。
それでも、少なくともMSVC ++、gcc、clangでサポートされているリンク時最適化を見てください。
- 従来、Cでは、ヘッダーが翻訳単位の最小限のパブリックインターフェイスを表す.c / .hレイアウトが使用されてきました。同様に、.cpp / hpp。
APIとABIの安定性を高め、コンパイル時間を最小限に抑えることは、最小限のインターフェイスのみを提示することです。
特に、C ++クラスは、プライベートビットがすべてヘッダーにリークするので、保護されたものが派生するかどうかに関係なく、C ++クラスは実際にはそれに適合していません。
設計パターンPIMPLは、このような詳細を削減するためのものです。
ただし、C ++でインターフェイスと実装を完全に分離できない部分はテンプレートです。
委員会は、エクスポートされたテンプレートを使用して何かを実行しようとしましたが、それはあまりにも複雑で実際には機能していないため放棄されました。
現在、彼らは適切なモジュールシステムに取り組んでいますが、ゆっくりしています。これにより、コンパイル時間が大幅に短縮されます。また、表面を縮小することでAPIとABIの安定性も向上します。
一般に、ヘッダーのみのライブラリは、従来のレイアウトよりもコードおよび実行時間の面で効率的ですか?もしそうなら、これは広範なインライン展開または他の最適化のためですか?
ヘッダーのみのライブラリは、コードサイズと実行時間でより効率的になりますが、それはライブラリが共有されるかどうか、ライブラリの使用量、使用方法、インライン化がその特定のケースで決定的な勝利を証明するかどうかによって異なります。
また、インライン化が最適化にとって非常に重要である理由は、インライン化自体が非常に大きな後押しであるためではありませんが、一定の伝播とさらなる最適化の機会のために開きます。