为什么 "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?。
例如: 复杂的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?。