Распределитель журналов для std :: Containers?

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::mpl а также mpllibs::metaparse… в идеале я просто хотел бы написать

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

и покончим с этим.

3

Решение

Хотя, возможно, и не «более общий», если вы не хотите обрабатывать все выделение самостоятельно, вы можете наследовать от стандартного распределителя std::allocator:

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

в allocate/destroy/deallocate функции регистрируют, а затем вызывают методы родителей:

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 на самом деле не предназначен для наследования, примером чего является отсутствие виртуального деструктора.

5

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector