为什么“sizeof”运算符可以获取类型的大小?

时间:2021-07-03 09:31:44

标签: c++ sizeof

例如: 一个复杂的类

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”类型分配不同的内存。必须有一种方法来决定运行时的数据长度。

1 个答案:

答案 0 :(得分:1)

complex 类型的对象都具有相同的大小,因此您无需创建对象即可知道其大小。

sizeof(x) 是一个常量表达式。它不会在运行时评估。类定义对于编译器了解该类型对象的大小来说是必要且充分的。这也是您不能将 sizeof 与不完整类型(已声明但未定义)一起使用的原因。当您按值将 complex 传递给函数时,当您创建类型为 complex 的对象等时,编译器一直在使用该信息。

类型的大小是其成员的大小加上填充。有关详细信息,请参阅Why isn't sizeof for a struct equal to the sum of sizeof of each member?