【发布时间】:2013-02-19 11:19:24
【问题描述】:
X:我需要知道我的程序的每个部分使用了多少内存。我的程序大量使用 C++ 标准库。特别是,我想知道每个对象使用了多少内存。
我是怎么做的:记录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;
并完成它。
【问题讨论】:
-
这对我来说已经很笼统了,你想要什么更通用的?
-
不是问题的答案,但如果只有开发人员需要知道内存使用情况,最好使用内存分析,而不是检测整个代码库。
-
@daramarak:实际上,这取决于您想要什么以及可以使用什么工具;例如,尽管我很喜欢 Massif,但你不能在生产环境中使用它,而一个简单的记录器可能是可行的。
-
@PlasmaHH 我认为它也是通用的,但整个元解析和 boost::mpl 依赖项都是需要考虑的。我希望有一种更简单的方法来做到这一点,它不依赖于 metaparse/boost::mpl。我会用这个更新问题。
-
@daramarak 用户也需要。它是一个 HPC 应用程序,我们的用户也是开发人员。但是很好的提示!谢谢!还可以考虑threadspotter、scalasca等。
标签: c++ memory-management c++11 boost-mpl allocator