对 类 使用 sizeof

Using sizeof for classes

有一个简单的C++ class

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....   
};

当我从这个 class 实例化一些对象时,我想在运行时找到它们的大小。所以,我只是在每个对象的许多执行周期之后写了 sizeof 。例如:

LASet LBAStartSet;
...
...
cout << "sizeof LBAStartSet = " << sizeof( LBAStartSet ) << '\n';

cout 行仅报告所有对象的 72 意味着 72B,但 top 命令显示 15GB 内存。

我在 cppreference 阅读了手册,其中 sizeof 不适用于某些不完整的数据类型。我的数据类型不完整吗?

欢迎任何反馈。

我认为问题出在成员_myset 上。它是一个对象,当您在_myset 中插入值时,sizeof(LASet) 不会增加。 sizeof(LAset) 很可能是在编译时求值的。

您可以使用 set::size 来找出集合中有多少个元素。如果您对 LASet 的所有实例都这样做,您可以获得所需内存的粗略近似值。

As I instantiate some objects from this class, I want to find their sizes during the runtime.

您似乎假设对象的大小可以在 运行 时间改变。那是不可能的。对象的大小在编译时是相同的,因为它在整个 运行 时间都是一样的。编译后它永远不会改变。

Is my data type incomplete?

没有。如果是,那么你的程序将是错误的,编译器可能会拒绝编译。如果仅声明但未定义类型,则该类型是不完整的。您已经定义了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)。

I want to monitor the growth of the data size during the execution. Is there any way to find that?

标准 C++ 中没有。但是有 OS 种具体方法。例如,在 Linux 中,有 /proc 伪文件系统,您可能对 /proc/self/status

的内容感兴趣