2

増え続けるクラス/関数のライブラリを構築するとき、プロジェクトのすべての一般的なヘッダーファイルを#includeする一種の「傘」ヘッダーファイルをよく目にしました。例えば:

dsp.h
#include "file1.h"
#include "file2.h"
...
#include "filex.h"

すべてが必要な場合もありますが、機能/オプションの選択のみが必要な場合もあります。#include dsp.hであるが、たとえばfile2.hから何も使用しない場合、コンパイラーは知っていますか?ビルドで最適化することは可能ですか?

それ以外の場合、私の解決策は、オプションのコードをプリプロセッサディレクティブ内にラップしてから、必要なものを定義することです。おそらく、これはより安全で効率的なソリューションですか?

4

4 に答える 4

4

コードの最適化またはビルド時間の最適化について話しているのですか?

不要な未使用のヘッダーは、生成されるコードを変更しないため、ここで最適化の問題はありません。

ただし、ビルド時間が長くなります。これは、ビルド ツールによって最適化されません。ビルド時間を最適化したい場合は、John Lakos著『 Large Scale C++ Software Design 』を参照してください。

于 2012-12-09T03:52:44.833 に答える
3

プリプロセッサは最適化を行いません。コードのセマンティクスについては何も知らないため、ヘッダーファイルから何かを使用しているかどうかはわかりません。したがって、#includeステートメントは最適化されていません。

于 2012-12-09T03:49:27.060 に答える
1

プリプロセッサはC++コンパイラとは別のプログラム(および言語)であるため、プリプロセッサが何が使用されているかを知る方法はありません。したがって、コンパイラはヘッダーファイルにあったすべてのものを受け取ります。

于 2012-12-09T03:49:23.977 に答える
0

インクルード ファイルが読み取られ、コンパイラが実際にコードの生成を開始する前に、ソース コードの一部に挿入されます。

はい。原則として、プログラムによって参照されないものは、最終的な実行可能ファイルには入れられません。それを最適化と考えて構いません。詳細はコンパイラやリンカによって異なります。

于 2012-12-09T04:03:35.473 に答える