C++ プログラムまたは C++ プログラム内のブロックによって使用されるメモリを測定する最良の方法は何ですか。したがって、測定コードはコードの一部である必要があり、外部から測定することはできません。私はそのタスクの難しさを知っているので、100% 正確である必要はありませんが、少なくともメモリ使用量については良い印象を与えてくれます。
4 に答える
オーバーロードnew
し、delete
おそらく行く方法です。特定のクラスだけでなく、より一般的なものかもしれません。new
ただし、とが作成された場所にもマークを付ける必要がありますdelete
。そして、ある種の開始/リセットまたは何かをマークして、このブロックに入り、ブロックを終了します。そして、それが起こった後にそれを監視できるようにするには、履歴を保持する必要があります。
ブロック レベルでの測定は、テスト対象のコードに明示的にインストルメンテーションを直接追加する意思がない限り、(せいぜい) 困難です。
これを行うためにクラス レベルで と のnew
オーバーロードを開始することはありません。delete
代わりに、::operator new
andのオーバーロードを使用し::operator delete
ます。これは基本的にはじょうごの先端です (いわば)。他のすべての動的メモリ管理は、最終的にはそれらを呼び出すことになります (ほとんどの場合、かなり直接的に行われます)。そのため、通常、プログラム全体の動的メモリ使用量について最も多くのことを伝えます。
個々のクラスのオーバーロードnew
に対処する必要がある主な時間は、それらがすでにオーバーロードされているため、別のプールを管理しており、特定の時間にそのプールがどれだけ使用されているかを気にする場合です。 . その場合、特定の間隔でのメモリ使用量の最高水準点のようなものを取得するために、インストルメンテーションを直接追加する必要があります。delete
他の人が指摘したように、 new と delete をオーバーロードして、割り当てられたヒープの量を測定できます。スタックに対して同じことを行うには、冒険心があれば、ASM を実行する必要があります。x86-64 の GCC でスタック位置を取得するには:
int64_t x = 0;
asm("movq %%rsp, %0;" : "=r" (x) );
これにより、x にスタック ポインターのアドレスが入力されます。これをコードのいくつかの場所に配置し、ブロックに入る前後の値を比較します。
コンパイラがメモリを割り当てる方法/タイミングのために、必要なものを取得するためにいくつかの作業が必要になる場合があることに注意してください。それは思ったほど直感的でも些細なことでもありません。
new
and演算子のクラスレベルのオーバーライドは、delete
あなたが望むものです。