gpt4 book ai didi

c++ - 对类使用 sizeof

转载 作者:行者123 更新时间:2023-11-30 03:41:03 24 4
gpt4 key购买 nike

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

欢迎任何反馈。

最佳答案

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 中的元素(我假设这就是您使用的)增加了 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++ 中。但是有操作系统特定的方法。例如在 Linux 中,有 /proc伪文件系统,您可能对 /proc/self/status

的内容感兴趣

关于c++ - 对类使用 sizeof,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37586439/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com