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>>;
}
loggin分配器实现如下:
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;
并完成它。
答案 0 :(得分:5)
虽然可能不是“更通用”,但如果您不想自己处理所有分配,则可以继承标准分配器std::allocator
:
template<class T, class S = MPLLIBS_STRING("unknown"), class Allocator = std::allocator<T>>
struct LoggingAllocator : public Allocator {
// ...
};
在allocate
/ destroy
/ deallocate
函数中执行日志记录,然后调用parents方法:
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
并非真正设计用于继承,例如它没有虚拟析构函数。