ReSharper 2019.2ヘルプ

インクルードの分析

ReSharper | インスペクション | 現在のプロジェクトに分析を含める
ReSharper | インスペクション | ソリューションに含まれる分析

巨大なインクルード階層に起因する長いビルド時間は、大規模な実世界のC++プロジェクトにおける最大の問題の1つです。ReSharperには、デザイン時のインクルードの最適化に役立ついくつかの機能があります。例: 未使用#include ディレクティブをマークするか、単に必要な宣言を含むヘッダーを含める代わりに、未解決の名前に対する前方宣言を自動的に作成します。

階層的な問題をより体系的に解決するために、ReSharperは不要なヘッダーの依存関係を見つけて排除するコードインスペクションツールアナライザを含むを提供しています。

どのように役立つのですか?

典型的なプロジェクトには、何千もの #include ディレクティブが含まれている可能性があり、調査の価値があるのは明らかではありません。コンパイラのワークロード全体に加算するコード行数に基づいて、各ヘッダーファイルのビルド時間に対する寄与を推定するAnalyzerの試みが含まれます。これは正確なメトリックではありませんが、インクルードされているヘッダーファイルを見つけて優先順位を付けると便利な出発点です。

潜在的に最も大きなインパクトを持つヘッダーの依存関係を特定したら、標準的な方法で1つずつ取り除くことができます。たとえば、次のようにします。

  • 可能な限り前方宣言(英語)を使用し

  • 不要な #include ディレクティブを削除

  • Pimplイディオムを適用

  • 大きなヘッダーファイルを小さなヘッダーファイルに分割します。

Includes Analyzerの重要な制限の1つは、分析プロセスを高速化するためにReSharperが実際には完全な前処理段階を実行していないことです。つまり、行数に実際にマクロ展開の結果は含まれず、ガードを含むガードも処理されません。代わりに、ReSharperは各ヘッダファイルがインクルードガードまたは#pragma onceディレクティブで始まり、ソースファイルに最大で1回含まれると仮定します。同じヘッダーを連続してインクルードすると、それが貢献した行の数には数えられません。つまり、内部ツリーノードの隣にある時が含まれてやその他のメトリックがゼロになることがあります。

分析の開始

分析を開始するには、メインメニューからReSharper | インスペクション | 分析に含まれる...アクションの1つを呼び出します。または、ソリューションエクスプローラーのコンテキストメニューからIncludesを分析するを選択します。

ReSharperは、指定されたスコープ内のファイルを分析し、ファイル間の依存関係を調べる専用ツールウィンドウにレポートを表示します。分析を含むウィンドウには、2つのビューインクルードインクルードがあります。どちらも、各ノードがファイルに対応するツリーとして依存関係を含んでいます。対応するツールバーボタンを使用するか、コンテキストメニューから別のビューの同じファイルに移動して、これらのビューを切り替えることができます。

Includeesビュー

インクルードビューは、トップレベルのツリーノードのヘッダーファイルが直接的または間接的にそれを含むすべてのソースファイルに寄与するコードの行数を理解できます。このビュー内の子ノードは、親ノードからのファイルを含むファイルを表します。キャッチ2(英語)ソリューション全体の以下の分析を検討してください。

ReSharper Includes analysis - Includees view

ツリー内の各ノードには3つのメトリックがあります。

  • 時が含まれては、現在のノードへのパスを介して最上位ノードにヘッダーを含むソースファイルの数を示します。上記の例では、catch_common.h は合計75個のソースファイルに含まれていましたが、そのうち26個は catch_tag_alias_autoregistrar.h#include "catch_common.h" ディレクティブを通じて catch_common.h を含んでいました。

  • ラインの寄与は、最上位ノードのヘッダーが、推移的にインクルードされたファイルなしで、それ自体で現在のノードへのパスを介して貢献したコードの行数を示します。 catch_common.h は合計で4,050行のコードを提供しました。これは75(それを含むソースファイルの数)×54(ファイル内のコードの行数)です。 catch_tag_alias_autoregistrar.hには #include "catch_common.h" が含まれているため、合計4,050本のうち1,404本が提供されます。

  • ライン貢献度ラインの寄与に似ていますが、このメトリックは最上位ノードのファイルに推移的に含まれるすべてのヘッダーを考慮に入れます。例: catch_common.hは、それに含まれているヘッダと共に、ソリューション全体のコンパイル中に合計2,654,938行を提供します。これらの行のうち1,017,626は catch_tag_alias_autoregistrar.h内の #include "catch_common.h" のために投稿されます。ライン貢献度がデフォルトで、間違いなく最も有用なソート基準です。

インクルードビュー

インクルードビューはインクルードビューに似ていますが、逆の方法で動作します。ツリー内の子ノードは、親ノードからファイルに含まれるファイルを表します。

ReSharper Includes analysis - Includers view

このビューは、あたかもそれがスタンドアロンのソースファイルとしてコンパイルされたかのように、最上位ノードのファイルに推移的に何行のコード行が含まれるかを示します。このビューが提供する測定基準は次のとおりです。

  • インクルードカウント(インクルードファイル数)

  • 行数(ファイル自体のサイズ)

  • 行数(それに含まれるすべてのヘッダーファイルを含むファイルのサイズ)

オプション

ナビゲーションコントロールと更新ボタンに加えて、Includes分析ウィンドウのツールバーでは、次の2つのオプションを変更できます。

  • プロジェクトに属するルートノードのみを表示するは、どのプロジェクトにも属さないファイルに対応する最上位のツリーノードを非表示にします。これは、ソリューション内のヘッダーにのみ集中したい場合に、ライブラリーファイルをフィルタする素早い方法です。

  • デフォルトでは、解析中にReSharperは空白行とコメントをスキップします。空白行とコメント行をカウントするボタンを使用すると、この動作を変更できます。

最終更新日: 2019年8月16日