gprofを使用して(C ++)プログラムによるメモリ消費量を把握しようとしています。プログラムにはGUIがなく、完全にCLIベースです。
今、私はgprofを初めて使用するので、gprofの実行方法とスポット時間の消費方法を教えてくれたチュートリアルをいくつか読みました。
ただし、特定のクラスのセットによるメモリ消費量を調べる必要があります。多くの種類のプログラムがあるとしましょうA, ..., Z
。次に、プログラムを実行して、クラスのオブジェクトによって使用された累積メモリの数を確認しますA, E, I, O, U
(たとえば)。
このタスクにどのように取り組むことができるか、アイデアや指針はありますか?
私はgprofだけを検討しているわけではなく、仕事を成し遂げるあらゆる(fos)ソフトウェアを受け入れています。
もちろん、私はgoogleとstackoverflow.comの両方でこの問題の答えを検索しましたが、間違ったキーワードを使用しているか、この問題を抱えている人は誰もいません。
編集:これを手動で行うことに関する提案は明らかです。もちろん、それをアプリケーションにコーディングすることもできますが、変更したくないクラスがたくさんあります。また、合計メモリ消費量が必要なので、オブジェクトのサイズを個別に追跡する必要があるため、作成されたすべてのオブジェクトのみをカウントすることはできません。
Edit2:私はDeadMGの提案を修正しましたが、これは継承するだけです。それはかなりうまく機能するので、誰かが同様の問題を抱えている場合は、これを試してください。
class GlobalObjectCounter {
public:
struct ClassInfo {
unsigned long created;
unsigned long destroyed;
unsigned short size;
ClassInfo() : created(0), destroyed(0), size(0) {}
ClassInfo(unsigned short _size) : created(0), destroyed(0), size(_size) {}
void fmt(std::ostream& os) {
os << "total: " << (this->created) << " obj = " << (this->created*this->size) << "B; ";
os << "current: " << (this->created-this->destroyed) << " obj = " << ((this->created-this->destroyed) * this->size) << "B; ";
}
};
protected:
static std::map<std::string,ClassInfo> classes;
GlobalObjectCounter() {}
public:
static void dump(std::ostream& os) {
for (std::map<std::string,ClassInfo>::iterator i = classes.begin(); i != classes.end(); ++i) {
os << i->first << ": ";
i->second.fmt(os);
os << "\n";
}
}
};
template <class T> class ObjectCounter : public GlobalObjectCounter {
private:
static ClassInfo& classInfo() {
static ClassInfo& classInfo = classes[std::string("") + typeid(T).name()];
classInfo.size = sizeof(T);
return classInfo;
}
public:
ObjectCounter() {
classInfo().created++;
}
ObjectCounter(ObjectCounter const& oc) {
classInfo().created++;
}
ObjectCounter& operator=(const ObjectCounter&) {}
~ObjectCounter() {
classInfo().destroyed++;
}
};
マップルックアップは少し厄介です、私はそれを認めます、しかし私は各クラスのイテレータを保存することを世話する神経がありませんでした。主な問題は、カウントされたクラスごとに明示的に初期化する必要があるということでした。あなたがそれをより良くする方法を知っているなら、その方法を教えてください。