我试图用GPROF来计算我的(C++)程序的内存消耗。该程序没有gui,完全基于cli。
时间
消费。
一组特定类的消耗。
假设有一个程序有多种类型,
A, ..., Z
. 现在我想运行我的程序,看看类的对象使用了多少累积内存
A, E, I, O, U
(例如)。
你们有什么想法或者建议我如何完成这个任务吗?
我不完全考虑gprof,我对任何(fos)软件都持开放态度,可以完成这项工作。
DeadMG's suggestion
,我只需要从中继承。它工作得很好,所以,如果有人有类似的问题,试试这个。
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++;
}
};
我承认地图查找有点麻烦,但我没有勇气为每个类存储迭代器。主要的问题是您必须为每个计数的类显式初始化它。如果你知道如何做得更好,告诉我怎么做。