繁体   English   中英

如何通过一组C ++类来分析内存消耗?

[英]How to profile the memory consumption by a set of C++ classes?

我试图通过使用gprof来计算我的(C ++)程序的内存消耗。 该程序没有gui,它完全基于cli。

现在,我是gprof的新手,所以我阅读了一些教程,教我如何运行gprof和现场时间消耗。

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

你们有任何想法或指示我是如何处理这项任务的吗?
我并不是专门考虑gprof,我对任何完成工作的软件开放。

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

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

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

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

即使尝试处理内存使用问题,我也不知道gprof。 很明显的选择是valgrind 如果你只关心总内存使用量,你也可以自己完成这项工作(overload ::operator new::operator delete来跟踪程序请求的内存量)。 当然,你可能有一些代码通过其他方式获取内存(例如,直接调用类似sbrk东西),但这是相当不寻常的。 这些不会尝试跟踪静态分配和/或堆栈使用情况。

不重要的。

template<typename T> class Counter {
    static int count = 0;
    Counter() { count++; }
    Counter(const Counter&) { count++; }
    Counter& operator=(const Counter&) {}
    ~Counter() { count--; }
};
class A : Counter<A> {
    static int GetConsumedBytes() {
        return sizeof(A) * count;
    }
};

如果使用A涉及动态内存,则可以改进此解决方案。 您还可以覆盖全局运算符new / delete。

GlibC提供有关堆内存分配的统计信息。 看一下mallinfo 您可以在执行期间的各个点获取统计信息,并了解正在使用多少内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM