对 类 使用 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
的内容感兴趣
有一个简单的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