インクルードの分析
インクルードの巨大な階層によって引き起こされる長いビルド時間は、実際の大規模な C++ プロジェクトにおける最大の問題の 1 つです。ReSharper には、設計時のインクルードの最適化に役立ついくつかの機能があります。例: 未使用の #include
ディレクティブをマークするか、必要な宣言にヘッダーを含める代わりに、未解決の名前の前方宣言を自動的に作成します。
階層的な問題をより体系的に解決するために、ReSharper は不要なヘッダーの依存関係を見つけて排除するコードインスペクションツールアナライザーを含むを提供しています。
どのように役立つのですか?
典型的なプロジェクトには、何千もの #include
ディレクティブが含まれている可能性があり、調査の価値があるのは明らかではありません。コンパイラーのワークロード全体に加算するコード行数に基づいて、各ヘッダーファイルのビルド時間に対するコントリビュートを推定する Analyzer の試みが含まれます。これは正確なメトリクスではありませんが、インクルードされているヘッダーファイルを見つけて優先順位を付けると便利な出発点です。
潜在的に最も大きなインパクトを持つヘッダーの依存関係を特定したら、標準的な方法で 1 つずつ取り除くことができます。たとえば、次のようにします。
可能な限り前方宣言(英語)を使用して
不要な
#include
ディレクティブを削除Pimpl イディオムを適用
大きなヘッダーファイルを小さなヘッダーファイルに分割します。
Includes Analyzer の重要な制限の 1 つは、分析プロセスを高速化するために ReSharper が実際には完全な前処理段階を実行していないことです。つまり、行数に実際にマクロ展開の結果は含まれず、ガードを含むガードも処理されません。代わりに、ReSharper は各ヘッダーファイルがインクルードガードまたは #pragma once ディレクティブで始まり、ソースファイルに最大で 1 回含まれると仮定します。同じヘッダーを連続してインクルードすると、それが貢献した行の数には数えられません。つまり、内部ツリーノードの隣にある Times included やその他のメトリクスがゼロになることがあります。
分析の開始
分析を開始するには、メインメニューから Includes を分析するを選択します。
アクションの 1 つを呼び出します。または、ソリューションエクスプローラーのコンテキストメニューからReSharper は、指定されたスコープ内のファイルを分析し、ファイル間の依存関係を調べる専用ツールウィンドウにレポートを表示します。include 分析ウィンドウには、2 つのビュー Includees と Includers があります。どちらも、各ノードがファイルに対応するツリーとして依存関係を含んでいます。対応するツールバーボタンを使用するか、コンテキストメニューから別のビューの同じファイルに移動して、これらのビューを切り替えることができます。
Includees ビュー
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(ファイル内のコードの行数)です。catch_tag_alias_autoregistrar.h には
#include "catch_common.h"
が含まれているため、合計 4,050 本のうち 1,404 本が提供されました。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 ビュー
Includers ビューは Includees ビューに似ていますが、逆の方法で機能します。ツリー内の子ノードは、親ノードからのファイルに含まれるファイルを表します。
このビューは、あたかもスタンドアロンソースファイルとしてコンパイルされたかのように、トップレベルノードのファイルに推移的に含まれるコード行数を示します (たとえば、catch_common.h とそれに含まれるすべてのヘッダーを合わせたコード行は 42,365 行で、そのうち 27,046 行はコード行になります) #include<string>)
とともに提供されたものです。このビューが提供するメトリクスは次のとおりです。
インクルードカウント(インクルードファイル数)
行数(ファイル自体のサイズ)
行数(それに含まれるすべてのヘッダーファイルを含むファイルのサイズ)
オプション
ナビゲーションコントロールとリフレッシュボタンに加えて、Includes 分析ウィンドウのツールバーでは、次の 2 つのオプションを変更できます。
プロジェクトに属するルートノードのみを表示するは、どのプロジェクトにも属していないファイルに対応する最上位のツリーノードを非表示にします。これは、ソリューション内のヘッダーに焦点を合わせたい場合に、ライブラリファイルを除外する簡単な方法です。
デフォルトでは、解析中に ReSharper は空白行とコメントをスキップします。空白行とコメント行をカウントするボタンを使用すると、この動作を変更できます。
関連ページ:
C++ でのコード分析
ReSharper のコード解析の主な機能は、C++ でもサポートされています。これらの機能の詳細については、コード解析の該当するトピックを参照してください。このセクションのサブジェクトでは、フィーチャマトリックスを見つけて、C++ で正確にサポートされているものを確認することもできます。このトピックでは、C++ でコード解析機能を使用する例をいくつか見てみましょう。デフォルトでは、コードインスペクション、クイックフィックス、コンテキストアクションはすべてのソリューションファイルで使用できます。...
C++ のインレイヒント
パラメーター名ヒント:パラメーター名のヒントは、メソッド呼び出しで対応する引数の横にパラメーター名を表示するエディターの装飾です。これらは、関数呼び出しと集計の初期化でパラメーターの長い(場合によってはネストされた)リストを見つけるのに役立ちます。以下の例では、パラメーター名のヒントは、高さと幅の引数が混在しているという事実を見つけるのに役立ちます。パラメーター名のヒントは、初期化するメンバーの名前を示し、C++17 以降の複雑な集約の初期化を解くのに役立ちます。パラメーター名のヒントは、依存...
C++ のリファクタリング
リファクタリングを実行するシンボルにキャレットを置き、リファクタリングするコードフラグメントを選択するか、ツールウィンドウ内の項目を選択します。以下のいずれか 1 つを実行します: メインメニューからを選択し、目的のリファクタリングを選択します。このメニューで使用できるリファクタリングのリストは、現在のコンテキストによって異なります。ReSharper がコンテキストのリファクタリングを提案できない場合、メニュー全体が無効になります。エディター、ファイル構造ウィンドウ、またはその他の ReShar...