gpt4 book ai didi

c++ - 如何分析一组 C++ 类的内存消耗?

转载 作者:搜寻专家 更新时间:2023-10-30 23:49:48 25 4
gpt4 key购买 nike

我正在尝试使用 gprof 计算我的 (C++) 程序的内存消耗。该程序没有图形用户界面,它完全基于 cli。

现在,我是 gprof 的新手,所以我阅读了一些教程,它们教会了我如何运行 gprof 并发现时间消耗。

但是,我需要找出一组特定类的内存 消耗量。假设有一个程序有很多类型,A, ..., Z。现在我想运行我的程序并查看类 A、E、I、O、U 的对象使用了多少累积内存(例如)。

你们有什么想法或指示我可以如何处理这个任务吗?
我并不是只考虑 gprof,我对任何可以完成工作的 (fos) 软件持开放态度。

当然,我已经在 google 和 stackoverflow.com 上搜索了这个问题的任何答案,但要么我使用了错误的关键字,要么没有人遇到这个问题。

编辑:关于手动执行此操作的建议很明显。当然,我可以将其编码到应用程序中,但它涉及大量我不想更改的类。另外,我想要总内存消耗,所以我不能只计算所有创建的对象,因为我必须单独跟踪对象的大小。

Edit2:我修改了 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++;
}
};

map 查找有点讨厌,我承认,但我没有勇气为每个类存储迭代器。主要问题是您必须为每个计数的类显式初始化它。如果您知道如何做得更好,请告诉我怎么做。

最佳答案

我不知道 gprof 甚至试图处理内存使用问题。明显的替代方案是 valgrind .如果您只关心总内存使用量,您也可以自己完成这项工作(重载 ::operator new::operator delete 以跟踪程序占用了多少内存已请求)。当然,可能您有一些代码通过其他方式获取内存(例如,直接调用类似 sbrk 的东西),但这是公平异常。不过,它们不会尝试跟踪静态分配和/或堆栈使用情况。

关于c++ - 如何分析一组 C++ 类的内存消耗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3585341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com