5

X:プログラムの各部分が使用しているメモリ量を知る必要があります。私のプログラムでは、C++ std ライブラリを多く使用しています。特に、各オブジェクトが使用しているメモリの量を知りたいです。

やり方:の消費をログに記録するにはsome_vector、次のように記述します。

my::vector<double,MPLLIBS_STRING("some_vector")> some_vector;

どこ

namespace my {
  template<class T, class S>
  using vector = std::vector<T,LoggingAllocator<T,S>>;
}

ログイン アロケータは次のように実装されます。

template<class T, class S = MPLLIBS_STRING("unknown")> struct LoggingAllocator {
  // ... boilerplate ...

  pointer allocate (size_type n, std::allocator<void>::const_pointer hint = 0) {
    log_allocation(boost::mpl::c_str<S>::value);
    // allocate_memory (I need to handle it myself)
  }
  void destroy (pointer p) ; // logs destruction
  void deallocate (pointer p, size_type num); // logs deallocation
};

質問:この動作を一般的な方法で取得するためのより良い方法はありますか? つまり、よりシンプルで、より良く、依存関係がなくboost::mplmpllibs::metaparse... 理想的には、私はただ書きたいだけです

my::vector<double,"some_vector"> some_vector;

そしてそれで終わります。

4

1 に答える 1

6

「より一般的」ではないかもしれませんが、すべての割り当てを自分で処理したくない場合は、標準の allocator から継承できますstd::allocator

template<class T, class S = MPLLIBS_STRING("unknown"), class Allocator = std::allocator<T>>
struct LoggingAllocator : public Allocator {
    // ...
};

//関数でログを記録してからallocate、親メソッドを呼び出しますdestroydeallocate

pointer allocate (size_type n, std::allocator<void>::const_pointer hint = 0) {
    log_allocation(boost::mpl::c_str<S>::value);
    return Allocator::allocate(n, hint);
}

ただし、std::allocator実際には継承されるように設計されていないことに注意してください。たとえば、仮想デストラクタがないことです。

于 2013-02-19T11:27:46.457 に答える