如何计算包含嵌套对象的C++对象的总内存大小
计算C对象的总内存占用(含vector内所有B实例)
实现思路
要算出完整的内存占用,得把三部分加起来:
- C对象自身的大小:直接用
sizeof(C)获取 - vector中所有B实例的总大小:用
vector.size() * sizeof(B)计算,因为vector的元素存在堆上,sizeof(vector)只算容器本身的管理结构大小 - 注意:如果B内部还有动态分配的内存(比如带指针、嵌套容器),那
sizeof(B)覆盖不了这部分,不过题目没提这种情况,默认B是无额外动态内存的值类型
示例代码
先给出你无法修改的类定义参考:
#include <vector> class A { int x; }; class B { // 第三方类,无法修改 char data[10]; }; class C { public: A a; std::vector<B> b; };
然后是你能修改的main函数部分:
#include <iostream> int main() { C c; // 往vector里添加几个B对象测试 c.b.emplace_back(); c.b.emplace_back(); c.b.emplace_back(); // 计算总内存 size_t total_mem = sizeof(c) + c.b.size() * sizeof(B); // 输出验证 std::cout << "C对象自身大小: " << sizeof(c) << std::endl; std::cout << "vector内B实例总大小: " << c.b.size() * sizeof(B) << std::endl; std::cout << "总内存占用: " << total_mem << std::endl; return 0; }
关键说明
std::vector的sizeof是固定值(64位系统一般是24字节,对应三个指针:指向数据、指向末尾、指向容量上限),和存储的元素数量无关,所以必须单独计算元素的总大小- 如果B类内部有隐藏的动态内存(比如包含
std::string),那这个方法算出来的结果会偏小,但因为B是第三方类无法修改,除非它提供获取内部内存的接口,否则没有办法准确统计这部分
内容的提问来源于stack exchange,提问作者user10299403
相关产品推荐
相关产品推荐

