使用sizeof进行类

时间:2016-06-02 08:25:34

标签: c++ memory-leaks sizeof

有一个简单的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对某些不完整的数据类型无效。我的数据类型不完整吗?

感谢任何反馈。

2 个答案:

答案 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的所有实例都这样做,你可以得到所需内存的粗略近似值。