例如: 一个复杂的类
class complex
{
public:
complex(double r = 0, double i = 0)
: re(r), im(i) {}
complex &operator += (const complex &);
double real() const { return re; }
double imag() const { return im; }
private:
double re, im;
};
我可以通过以下方式获得复杂的大小:
complex c(1, 2);
cout << sizeof(c) << endl;
但是为什么我也可以通过以下方式获得复合体的大小:
cout << sizeof(complex) << endl;
我没有实例化一个复杂的对象。计算机如何在不创建对象进行测试的情况下知道复合体的实际大小?
我不相信编译器包含操作系统不同位的所有数据类型长度信息。并且该程序可以在 32 位或 64 位操作系统上为“long”类型分配不同的内存。必须有一种方法来决定运行时的数据长度。
答案 0 :(得分:1)
complex
类型的对象都具有相同的大小,因此您无需创建对象即可知道其大小。
sizeof(x)
是一个常量表达式。它不会在运行时评估。类定义对于编译器了解该类型对象的大小来说是必要且充分的。这也是您不能将 sizeof
与不完整类型(已声明但未定义)一起使用的原因。当您按值将 complex
传递给函数时,当您创建类型为 complex
的对象等时,编译器一直在使用该信息。
类型的大小是其成员的大小加上填充。有关详细信息,请参阅Why isn't sizeof for a struct equal to the sum of sizeof of each member?。