私のプロジェクトのすべてのコードファイルには、リストやベクトルなどのいくつかのSTLヘッダーが含まれています。私は自分のヘッダーを知っている必要がありますが、ガードが含まれていますが、私が定義していない場合、このシナリオはどうですか?すべてのクラスに同じヘッダーを含める
ファイルごとに同じヘッダーを含めるのは悪いですか?それが含まれるたびにパフォーマンスのペナルティはありますか?
私のプロジェクトのすべてのコードファイルには、リストやベクトルなどのいくつかのSTLヘッダーが含まれています。私は自分のヘッダーを知っている必要がありますが、ガードが含まれていますが、私が定義していない場合、このシナリオはどうですか?すべてのクラスに同じヘッダーを含める
ファイルごとに同じヘッダーを含めるのは悪いですか?それが含まれるたびにパフォーマンスのペナルティはありますか?
パフォーマンスコストはありません。標準ヘッダーには独自のインクルードガードがあり、すべてのインクルードガードはプリプロセッサによって最適化され、そのたびにファイルが実際にリロードされることはありません。
常に正確さと保守性が常に重要です...ファイルを並べ替えて「未定義の識別子」エラーが発生するか悪化すると、作業を補完するためにコンパイル時にどれだけの時間を節約する必要がありますか?
EDIT:すべてのヘッダーファイルと同じ標準ヘッダーを含めても、パフォーマンスを向上させることはできません。ソースファイルから標準ヘッダーを追加すると、パフォーマンスが低下します。質問は多少曖昧ですが、いずれにせよ、C++コンパイルの本当に高価な部分は、通常、テキストの解析ではなく、テンプレートのインスタンス化です。
一般的なルールとして、
ソースファイルに必要なときだけヘッダーファイルを含める必要があります。
ガードを含めると、同じヘッダーファイルが同じ翻訳単位に複数回含まれることを防ぎ、リンクエラーからあなたを守りますが、Ofcourse標準ライブラリヘッダーには独自のヘッダーファイルがあります。
ただし、ヘッダファイルを必要としないソースファイルに含めると、コンパイルが増加する可能性があります。&は名前空間名の汚染を引き起こします。
異なるヘッダーが含まれているために2つの異なるファイルで2つの異なる方法でシンボルを定義すると、またはあなたはむしろエラーを見ますか?とにかく 'namespace'を使わなければ起こるべきではありません。あなたはしてはいけませんが、それを仮定しても、状況は赤旗に値するでしょう。 – Potatoswatter
@Potatoswatter:2つの異なるファイルで2つの異なる方法でシンボルを定義するのはなぜですか?彼らが標準的な図書館のシンボルであり、意図的に自分自身を撃つことを意図していない限り、それはまったく起こらないべきであり、もし起これば、それは追跡され、訂正されるべきである。 –
...より簡潔に:名前空間の汚染はあまりにも多くのヘッダーの影響ではなく、名前空間の範囲で不適切に定義することの効果です。 – Potatoswatter
* STL *ヘッダーではなく*標準ライブラリ*ヘッダーを含めることを完全に確信しています... – Griwes