2

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 ++リフレクションは、プロファイリングされたクラスとプロファイリングされたクラスの間の依存関係を減らす手法であると考えられますか?

4

1 に答える 1

1

これにより、スタック オブジェクトとヒープ オブジェクトの作成を追跡できます

#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、派生クラスによって継承される基本クラスの標準をラップし、ヒープ割り当てを追跡できるようにします。そのため、作成されたインスタンスの数とヒープ上の数がわかり、残りがスタック上にあると推測できます (プログラムでオブジェクト プールやその他のより風変わりな割り当て戦略を使用している場合を除きます)。

于 2013-02-24T11:40:38.237 に答える