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

Why the "sizeof" operator can get the size of a type?

例如: 复杂的class

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;

我没有实例化一个复杂的对象。计算机如何在不创建对象来测试的情况下知道复杂的实际大小?

我不相信编译器包含 OS 不同位的所有数据类型长度信息。并且程序可以在 32 位或 64 位 OS 上为 'long' 类型分配不同的内存。 运行 时间必须有一种方法来决定数据长度。

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

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

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