有没有办法打印一个对象分配的堆内存量?
Is there a way to print the amount of heap memory an object has allocated?
在 运行 程序中,我如何 track/print 对象分配的堆内存量?
例如:
#include <iostream>
#include <vector>
int main(){
std::vector<int> v;
std::cout << heap_sizeof(v) << '\n';
for (int i = 0; i < 1000; ++i){
v.push_back(0);
}
std::cout << heap_sizeof(v) << '\n';
}
是否有可以替代 heap_sizeof()
的实现?
首先,v
分配在栈上,而不是堆上。
为了得到它使用的space总量,我建议使用这个函数:(找到on this article,并稍微修改)
template <typename T>
size_t areaof (const vector<T>& x)
{
return sizeof (vector<T>) + x.capacity () * sizeof (T);
}
如果不想计算 std::vector
对象本身的大小,删除带有 sizeof
的部分:
template <typename T>
size_t heap_sizeof (const vector<T>& x)
{
return x.capacity () * sizeof (T);
}
一切都是开箱即用的,不,这是不可能的。不过,您确实有几个选择可以自己完成。
如果您专门为标准容器需要它,您可以实现一个分配器来跟踪通过该分配器分配(和未释放)的内存。
如果您希望通过 new
(无论是否为容器)分配的所有内容都具有此功能,您可以在全局 and/or [=23= 上提供自己的 operator new
实现]-特定的基础,并让它(例如)构建一个从指针到块大小的无序映射,以告诉您它分配的任何块的大小(并且您必须提供一个函数来检索该大小)。根据平台的不同,这也可以使用特定于平台的功能来实现。例如,当你为微软的编译器(好吧,库,真的)构建时,你的 operator new
的实现根本不需要做任何特殊的事情,并且检索块大小的函数看起来像这样:
size_t block_size(void const *block) {
return _msize(block);
}
另一种可能性是将每个请求块的分配大小增加一个足以容纳大小的整数大小。在这种情况下,您将分配比用户请求更大的数据块,并将该块的大小存储在 returned 的块的开头。当用户请求块的大小时,您从他们传递的指针获取正确的(负)偏移量,并return您存储在那里的值。
如果您不关心每个对象分配的内容,而更关心 allocated/freed 到某个时间点之间有多少内存,您可以使用 malloc 统计功能。每个 malloc 都有自己的版本。在 linux 你可以使用 mallocinfo()
.
在 运行 程序中,我如何 track/print 对象分配的堆内存量?
例如:
#include <iostream>
#include <vector>
int main(){
std::vector<int> v;
std::cout << heap_sizeof(v) << '\n';
for (int i = 0; i < 1000; ++i){
v.push_back(0);
}
std::cout << heap_sizeof(v) << '\n';
}
是否有可以替代 heap_sizeof()
的实现?
首先,v
分配在栈上,而不是堆上。
为了得到它使用的space总量,我建议使用这个函数:(找到on this article,并稍微修改)
template <typename T>
size_t areaof (const vector<T>& x)
{
return sizeof (vector<T>) + x.capacity () * sizeof (T);
}
如果不想计算 std::vector
对象本身的大小,删除带有 sizeof
的部分:
template <typename T>
size_t heap_sizeof (const vector<T>& x)
{
return x.capacity () * sizeof (T);
}
一切都是开箱即用的,不,这是不可能的。不过,您确实有几个选择可以自己完成。
如果您专门为标准容器需要它,您可以实现一个分配器来跟踪通过该分配器分配(和未释放)的内存。
如果您希望通过 new
(无论是否为容器)分配的所有内容都具有此功能,您可以在全局 and/or [=23= 上提供自己的 operator new
实现]-特定的基础,并让它(例如)构建一个从指针到块大小的无序映射,以告诉您它分配的任何块的大小(并且您必须提供一个函数来检索该大小)。根据平台的不同,这也可以使用特定于平台的功能来实现。例如,当你为微软的编译器(好吧,库,真的)构建时,你的 operator new
的实现根本不需要做任何特殊的事情,并且检索块大小的函数看起来像这样:
size_t block_size(void const *block) {
return _msize(block);
}
另一种可能性是将每个请求块的分配大小增加一个足以容纳大小的整数大小。在这种情况下,您将分配比用户请求更大的数据块,并将该块的大小存储在 returned 的块的开头。当用户请求块的大小时,您从他们传递的指针获取正确的(负)偏移量,并return您存储在那里的值。
如果您不关心每个对象分配的内容,而更关心 allocated/freed 到某个时间点之间有多少内存,您可以使用 malloc 统计功能。每个 malloc 都有自己的版本。在 linux 你可以使用 mallocinfo()
.