大規模な継承された C/C++ プロジェクトがあります。すべてのデータ型の「sizeof」に関するレポート、およびそのようなプロジェクトの各関数のスタック フットプリントの内訳を生成するための優れたツールまたは手法はありますか。
4 に答える
なぜこれをやりたいのか知りたいのですが、それは単なる好奇心です。
テンプレート化されていない限り、使用されるすべてのクラスの sizeof を決定するのは簡単です。テンプレート化されている場合は、すべてのインスタンス化も確認する必要があります。
同様に、関数の呼び出しごとの sizeof を決定するのは簡単です。これは、渡された各パラメーターの sizeof に関数のオーバーヘッドを加えたものです。
プログラム全体の完全なメモリ使用量を決定するために、それがすべて静的に定義されていない場合、ランタイム プロファイラーなしでは実行できませんでした。
すべてのクラス名をファイルに収集するシェル スクリプトを作成するのは非常に簡単です。そのファイルは、各クラスの sizeof への一連の呼び出しである .cpp ファイルとして構築できます。ファイルに各ヘッダー ファイルも #include されている場合は、コンパイルして実行し、クラスだけのメモリ フットプリントの出力を取得できます。
同様に、すべての関数定義を選別して、それらが参照またはポインター引数を使用していない場合 (つまり、クラス インスタンス全体をスタックにコピーする場合) を確認するのは、非常に簡単です。
以上のことから、私は既存のツールを知らないと言えますが、ツールを作成することは難しくありません。
関数のスタックフットプリントについて同じ情報を探していますが、ウォーレンが言ったことが真実だとは思いません。はい、関数のスタックに影響を与えるものの一部はパラメーターですが、関数のすべてのローカル変数は、変数のスコープに関係なく、予約するスタックスペースの量を決定するために使用されることもわかりました。働き。
私が使用している特定の貧弱なコード例では、200を超えるローカルクラスインスタンスがあり、それぞれがif(blah-blah)句によって保護されていますが、予約されたスタックスペースはこれらの保護されたローカル変数によって変更されます。
各メソッドの関数プロローグを読み取って、関数用に予約されているスペースの量を判別できるようにする必要があることはわかっていますが、それをどのように行うのでしょうか。
スタック フットプリントの概念が最新のコンパイラに実際に存在するかどうかはわかりません。つまり、使用されるスタック スペースの量を決定するには、実行される分岐に依存し、分岐は入力パラメーターに依存し、一般的に停止問題を解決する必要があると思います。
ツールについては知りませんが、MSVC で作業している場合は、DIA SDKを使用して .PDB ファイルからサイズ情報を抽出できます。残念ながら、これはスタック フットプリント IIRC では機能しません。