8

チュートリアルを使用して、Qt の学習を始めたところです。私は現在、新しい LCDRange クラスを作成したチュートリアル 7 に取り組んでいます。LCDRange (.cpp ファイル) の実装は Qt QSlider クラスを使用するため、.cpp ファイルでは

#include <QSlider>

ただし、ヘッダーには前方宣言があります。

class QSlider;

Qtによると、

これはもう 1 つの古典的なトリックですが、あまり使用されていません。クラスのインターフェースに QSlider は必要ないため、実装のみで、ヘッダー ファイルでクラスの前方宣言を使用し、QSlider のヘッダー ファイルを .cpp ファイルに含めます。

コンパイラは通常、実際のソース コードではなく、ヘッダー ファイルの解析にほとんどの時間を費やすため、これにより大きなプロジェクトのコンパイルが大幅に高速化されます。このトリックだけで、多くの場合、コンパイルを 2 倍以上高速化できます。

これはやる価値がありますか?理にかなっているように思えますが、追跡する必要があるもう 1 つのことです。ヘッダー ファイルにすべてを含めるだけの方がはるかに簡単だと思います。

4

8 に答える 8

3

はい、確かに役に立ちます。レパートリーに追加するもう 1 つのことは、コンパイル時間が心配な場合のプリコンパイル済みヘッダーです。

FAQ 39.12および39.13を参照してください

于 2009-04-26T16:20:41.950 に答える
2

標準ライブラリは、標準ヘッダーの一部の iostream クラスに対してこれを行い<iosfwd>ます。ただし、これは一般的に適用できる手法ではありません。他の標準ライブラリ タイプにはそのようなヘッダーがないことに注意してください。また、(IMHO) クラス階層を設計するためのデフォルトのアプローチであってはなりません。

これはプログラマーにとってお気に入りの「最適化」のように思えますが、ほとんどの最適化と同様に、そのような宣言の有無にかかわらず、実際にプロジェクトのビルドのタイミングを計った人はほとんどいないのではないかと思います。この分野での私の限られた実験では、最新のコンパイラでプリコンパイル済みヘッダーを使用すると、それが不要になることが示されています。

于 2009-04-26T16:27:28.627 に答える
0

あなたが書くとき...

「foo.h」を含める

...これにより、従来のビルドシステムに「ライブラリファイルfoo.hに何らかの変更がある場合はいつでも、このコンパイル単位を破棄して再構築するように指示します.foo.hに起こったことがコメントの追加だけであっても、または foo.h がインクルードするファイルへのコメントの追加; 起こったのは、非常に気難しい同僚が中かっこのバランスを取り直しただけだったとしても; 圧力をかけられた同僚が foo.h を変更せずに不注意でチェックインした以外に何も起こらなかったとしてもタイムスタンプを変更しました。」

なぜそのようなコマンドを発行したいのですか?ライブラリ ヘッダーは、一般にアプリケーション ヘッダーよりも多くの人間の読者がいるため、バイナリに影響を与えない変更に対して特別な脆弱性があります。たとえば、関数や引数のドキュメントの改善、バージョン番号や著作権の日付の増加などです。

C++ の規則では、前方宣言をサポートするために、( structclassとは異なり) コンパイル単位の任意の時点で名前空間を再度開くことができます。

于 2009-04-26T17:45:48.360 に答える