簡體   English   中英

C ++對象生命周期分析

[英]C++ object lifetime profiling

ObjectInfo類是診斷類,旨在跟蹤統計數據,例如壽命和對象數量。 如圖所示,特定的類從ObjectInfo繼承。 然后,在概要分析的類的主體中聲明該特定類的成員。

盡管該解決方案有效,但由於需要使用概要分析類與概要分析類保持同步,因此難以維護,因為該類名用於標識后面的類。 擴展分析類以收集不同的信息(例如對象的大小)也將很困難。

提出一個更好的解決方案,使配置文件和配置文件類之間的依賴性最小。

是否有可能實施一項檢查,以確定配置文件類的對象是在堆棧還是堆上創建的?

-ObjectInfo.h-

#pragma once

class ObjectInfo
{
 public:
  ObjectInfo(const char* objectName);
  virtual ~ObjectInfo(void);

 private:

   static int  m_counter;
   int         m_objectNumber;
   const char* m_className;
};

-ObjectInfo.cpp-

#include "StdAfx.h"
#include "ObjectInfo.h"
#include <iostream>
#include "TimePrinter.h"

using namespace std;
int ObjectInfo::m_counter = 0;
ObjectInfo::ObjectInfo(const char* name) :
m_className(name)
{
   m_objectNumber = ++m_counter;
   cout << "Object: " << m_className << "# " << m_objectNumber << " created @ " <<
   TimePrinter()<< endl;
}

ObjectInfo::~ObjectInfo(void)
{
  cout << "Object: " << m_className << "# " << m_objectNumber << " destroyed @ " << 
  TimePrinter() << endl;
}

-使用模式-

struct _AInfo : public ObjectInfo {
    _AInfo() : ObjectInfo("_A") {}
};

struct _A {
  _AInfo m_info;
};

我最初以為這個問題是關於使用C ++反射技術來收集運行時信息的問題。 但是,我不知道是否有一種方法可以使用C ++反射來測量對象的壽命。 此外,您是否認為C ++反射是一種可減少配置文件類與性能分析類之間的依賴關系的技術?

這可以跟蹤堆棧與堆對象的創建

#include <iostream>

template <class CRTP>
struct AllocationTracker
{
    AllocationTracker()
    {
        ++totalCreated;
    }

    void* operator new(size_t sz)
    {
        ++heapCreated;
        return ::operator new(sz);
    }

    static int totalCreated;
    static int heapCreated;
};

template <class CRTP>
int AllocationTracker<CRTP>::totalCreated;
template <class CRTP>
int AllocationTracker<CRTP>::heapCreated;

class Derived : public AllocationTracker<Derived>
{
};

int main()
{
    using namespace std;
    cout << Derived::heapCreated << "/" << Derived::totalCreated << endl; // 0/0
    Derived dStack;
    cout << Derived::heapCreated << "/" << Derived::totalCreated << endl; // 0/1
    Derived* dHeap = new Derived;
    cout << Derived::heapCreated << "/" << Derived::totalCreated << endl; // 1/2
}

這將使用Bartek在對您的問題的評論中提出的CRTP。 這使我們可以分別跟蹤每個派生類型。 它還包裝了基類的new標准,它由派生類繼承,這使我們可以跟蹤堆分配。 因此,我們知道創建了多少實例,堆上有多少實例,並且我們可以推斷出其余實例在堆棧上(除非您在程序中使用對象池或其他一些更奇特的分配策略)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM