有一个简单的C ++类
class LASet
{
public:
long int maxValue, minValue;
int _count;
set <long int> _mySet;
LASet()
{
maxValue = 0;
_count = 0;
minValue =std::numeric_limits<long int>::max();
_mySet.clear();
}
void Add(long int value)
{
if (_mySet.find(value) != _mySet.end())
return;
if (value > maxValue)
maxValue = value;
if (value < minValue)
minValue = value;
_mySet.insert(value);
_count++;
}
// some helper functions....
};
当我从这个类中实例化一些对象时,我想在运行时找到它们的大小。所以,我只是在为每个对象执行多个周期后编写sizeof
。例如:
LASet LBAStartSet;
...
...
cout << "sizeof LBAStartSet = " << sizeof( LBAStartSet ) << '\n';
cout
行仅报告所有对象的72
表示72B,但top
命令显示15GB的内存。
我在cppreference阅读了手册,sizeof
对某些不完整的数据类型无效。我的数据类型不完整吗?
感谢任何反馈。
答案 0 :(得分:2)
当我从这个类中实例化一些对象时,我想在运行时找到它们的大小。
您似乎假设对象的大小可以在运行时更改。这是不可能的。对象的大小在编译时是相同的,因为它贯穿整个运行时。编译后它永远不会改变。
我的数据类型是否不完整?
没有。如果是,那么你的程序将是格式错误的,编译器可能会拒绝编译。如果仅声明了类型,则类型不完整,但未定义。您已定义LASet
,因此已完成。
您似乎还假设std::set
中的元素(我假设您使用的是)增加了设置对象的大小。他们没有。它们不能,因为尺寸总是保持不变并且必须保持不变。相反,对象存储在对象外部,即所谓的动态存储。
因此,程序使用的内存大致为:
sizeof LBAStartSet
+ LBAStartSet._mySet.size() * (sizeof(long) + overhead_of_set_node + padding)
+ overhead_of_dynamic_allocation
+ static_objects
静态对象包括std::cout
之类的内容。动态分配的开销取决于实现,但它可以是动态分配对象数量的O(n)。
我想在执行期间监控数据大小的增长。有没有办法找到它?
不是标准的c ++。但是有特定于操作系统的方式。例如,在Linux中,有/proc
伪文件系统,您可能对/proc/self/status
的内容感兴趣
答案 1 :(得分:0)
我认为问题出在成员_myset中。它是一个对象,当您在_myset中插入值时,sizeof(LASet)不会增加。它很可能是在编译时评估sizeof(LAset)。
您可以使用set :: size来查找集合中有多少元素。如果你对LASet的所有实例都这样做,你可以得到所需内存的粗略近似值。