インクルードの分析
インクルードの巨大な階層によって引き起こされる長いビルド時間は、実際の大規模な C++ プロジェクトにおける最大の問題の 1 つです。 ReSharper には、設計時にインクルードの最適化をサポートするいくつかの機能があります。 例えば、 未使用の #include ディレクティブをマークしたり、必要な宣言が含まれているヘッダーをインクルードする代わりに、未解決名の事前宣言を自動的に作成したりします。
インクルードの階層問題をより体系的に解決するために、ReSharper は不要なヘッダー依存を特定し排除するためのコードインスペクションツール Includes Analyzer を提供しています。
どのように役立つのですか?
典型的なプロジェクトには、何千もの #include ディレクティブが含まれている可能性があり、調査の価値があるのは明らかではありません。 コンパイラーのワークロード全体に加算するコード行数に基づいて、各ヘッダーファイルのビルド時間に対するコントリビュートを推定する Analyzer の試みが含まれます。 これは正確なメトリクスではありませんが、インクルードされているヘッダーファイルを見つけて優先順位を付けると便利な出発点です。
影響が大きい可能性があるヘッダー依存を特定した後、標準的なアプローチでそれらを1つずつ取り除くことができます。例えば:
可能な限り 前方宣言(英語)を使用して
不要な
#includeディレクティブを削除Pimpl イディオムを適用
大きなヘッダーファイルを小さなヘッダーファイルに分割します。
Includes Analyzer の重要な制限の1つは、ReSharper が解析を高速化するために実際には完全なプリプロセス ステージを実行しないことです。 つまり、行数には実際にはマクロ展開の結果が含まれず、インクルードガードも処理されません。 その代わり、ReSharper は各ヘッダーファイルがインクルードガードまたは #pragma once ディレクティブで始まり、どのソースファイルにも最大1回だけインクルードされると仮定します。 同じヘッダーの連続したインクルードは貢献した行数にカウントされないため、内部ツリーノードの横に Times included や他のメトリクスが0になることもあります。
分析の開始
解析を開始するには、メインメニューから アクションのいずれかを呼び出すか、ソリューションエクスプローラーのコンテキストメニューから Includes を分析する を選択します。
ReSharper は指定したスコープ内のファイルを解析し、専用のツールウィンドウでレポートを表示します。ここでファイル間の依存関係を調べることができます。 include 分析 ウィンドウには インクルーディー と インクルーダー の2つのビューがあり、いずれもノードごとにファイルに対応したツリーでインクルード依存関係が表示されます。 ツールバーの対応ボタンやコンテキストメニューから他のビューで同じファイルへ移動することで、それぞれのビューを切り替えることができます。
Includees ビュー
インクルーディー ビューは、トップレベルのツリーノードのヘッダーファイルが直接的または間接的にそれを含むすべてのソースファイルにコントリビュートするコードの行数を理解できます。 このビュー内の子ノードは、親ノードからのファイルを含むファイルを表します。 Catch2(英語) ソリューション全体の以下の分析を検討してください。

ツリー内の各ノードには 3 つのメトリクスがあります。
Times included は、現在のノードへのパスを介して、最上位ノードのヘッダーを含むソースファイルの数を示します。 上記の例では、 catch_common.h は合計 75 のソースファイルに含まれており、そのうち 26 は catch_tag_alias_autoregistrar.h の
#include "catch_common.h"ディレクティブを介して catch_common.h を含んでいました。Line contribution は、トップレベルノードのヘッダーが現ノードまでのパス上で他のファイルを経由せず直接何行のコードを貢献したかを示します。 catch_common.h は合計 4,050 行のコードを貢献しており、これは 75(インクルードするソースファイル数)× 54(そのファイル内のコード行数)です。 合計 4,050 行のうち、1,404 行は catch_tag_alias_autoregistrar.h 内の
#include "catch_common.h"により貢献しています。Line contribution inclusive は Line contribution に似ていますが、このメトリクスでは、最上位ノードのファイルに推移的に含まれるすべてのヘッダーが考慮されます。 たとえば、 catch_common.h は、それに含まれるヘッダーと合わせて、ソリューション全体のコンパイル中に合計 2,654,938 行にコントリビュートします。 これらの行のうち 1,017,626 行は、
catch_tag_alias_autoregistrar.hの#include "catch_common.h"のために提供されました。 Line contribution inclusive はデフォルトであり、おそらく最も便利な並べ替え基準です。
Includers ビュー
インクルーダー ビューは インクルーディー ビューと似ていますが、動作は逆であり、ツリー内の子ノードは親ノードのファイルからインクルードされているファイルを表しています。

このビューは、あたかもスタンドアロンソースファイルとしてコンパイルされたかのように、トップレベルノードのファイルに推移的に含まれるコード行数を示します (たとえば、 catch_common.h とそれに含まれるすべてのヘッダーを合わせたコード行は 42,365 行で、そのうち 27,046 行はコード行になります) #include<string>) とともに提供されたものです。 このビューが提供するメトリクスは次のとおりです。
インクルードカウント (インクルードファイル数)
行数 (ファイル自体のサイズ)
行数 (それに含まれるすべてのヘッダーファイルを含むファイルのサイズ)
オプション
ナビゲーションコントロールとリフレッシュボタンに加えて、Includes 分析ウィンドウのツールバーでは、次の 2 つのオプションを変更できます。
プロジェクトに属するルートノードのみを表示するは、どのプロジェクトにも属していないファイルに対応する最上位のツリーノードを非表示にします。 これは、ソリューション内のヘッダーに焦点を合わせたい場合に、ライブラリファイルを除外する簡単な方法です。
デフォルトで、ReSharper は解析時に空白行やコメントをスキップします。 空白行とコメント行をカウントするボタンを使用すると、この動作を変更できます。