一般来说,不,您不能假设某个任意类的大小只是其成员大小的聚合。一般来说,你也不应该关心*。编译器可以并且将更改您的类的大小,以便它们的大小是某些特定字节数的倍数。这样做的原因是为了提高性能。每个平台的字节数是不同的。
在这个具体的例子中,实际上可能是sizeof (test)
== sizeof (int)
,但我怀疑这是提示这个问题的真实代码。
有一些方法可以确保它确实如此,但它们依赖于特定于平台的功能。
首先,确保您的班级是 POD*,并且所有成员本身都是 POD。
其次,将打包设置为 1 个字节。在 GCC 和 MSVC 下,执行此操作的指令类似于:
#pragma pack (1)
当不是严格需要时,您应该关闭此包装,因为它可能会对性能产生负面影响:
#pragma pack (push, 1)
class test
{
public:
void someMethod();
void someOtherMethod();
int var;
};
#pragma pack (pop)
请注意,上面我删除了该private
部分。static
private
如果它有非或protected
数据成员,则您的类不是 POD 。出于同样的原因,我还删除了默认的构造函数和析构函数。
在 MSVC 和 GCC 下,sizeof(test)
将等于sizeof(int)
.
POD: 普通旧数据类型。为了使类(或结构)成为 POD,它必须没有用户定义的析构函数或构造函数、复制赋值运算符,并且没有指向成员的非static
成员类型指针。此外,它必须没有virtual
s、没有private
或非protected
成员static
,也没有基类。此外,它所拥有的任何非数据成员也static
必须是 POD 本身。换句话说,只是普通的旧(公共)数据。
“你也不应该在意。” 通常,您需要确保某个类的大小与成员的大小完全相同的唯一时间是在系统的边界处。例如,当通过套接字将数据移入或移出程序时。编译器填充你的类是有原因的。除非您有特定的、可证明的原因,否则您不应在此覆盖编译器。