代码之家  ›  专栏  ›  技术社区  ›  bitmask

如何通过一组C++类来配置内存消耗?

  •  2
  • bitmask  · 技术社区  · 14 年前

    我试图用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++;
        }
    };
    

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

    3 回复  |  直到 7 年前
        1
  •  3
  •   Puppy    14 年前

    琐碎的。

    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;
        }
    };
    

    如果使用动态内存,那么可以改进此解决方案。也可以覆盖全局运算符new/delete。

        2
  •  4
  •   Jerry Coffin    14 年前

    我甚至没有意识到gprof试图处理内存使用的问题。显而易见的选择是 valgrind ::operator new ::operator delete 跟踪程序请求的内存量)。当然,这是 可能的 您有一些通过其他方式获得内存的代码(例如,直接调用 sbrk 相当地

        3
  •  1
  •   doron    14 年前

    GlibC提供堆内存分配的统计信息。看一看 mallinfo . 您可能会在执行过程中的不同时间点获得统计信息,并了解使用了多少内存。