为什么引用大小始终为 4 个字节 - C++

why reference size is always 4 bytes - c++

本文关键字:字节 C++ 引用 为什么      更新时间:2023-10-16

在 32 位机器上,我总是得到引用 4 字节的sizeof,即使它是对双精度的引用,那么它真正在这 4 个字节中存储什么。

编辑:

class A{
public:
  double&  a;
};
int main(){
  cout << sizeof(A) << endl; // this will print out 4
}
标准在

sizeof(C++11,5.3.3/4(上非常明确:

应用于引用或引用类型时,结果为 引用类型的大小。

所以如果你真的在拿sizeof(double&),编译器告诉你sizeof(double)是4。

更新:所以,你真正在做的是将sizeof应用于类类型。在这种情况下,

当应用于类时,结果是 该类的对象 [...]

所以我们知道 A 内部引用的存在会导致它占用 4 个字节。这是因为即使标准没有规定如何实现引用,编译器仍然必须以某种方式实现它们。根据上下文的不同,这可能非常不同,但对于类类型的引用成员,唯一有意义的方法是在背后偷偷溜进double*,并称其为double&

因此,如果您的体系结构是 32 位(其中指针长度为 4 字节(,则可以解释结果。

请记住,引用的概念与任何特定的实现无关。该标准允许编译器随心所欲地实现引用。

你不能,也不是。

C++引用不是指针。它是对象的别名。有时,编译器选择使用指针来实现这一点。但通常,它通过什么都不做来实现它。通过简单地生成直接引用原始对象的代码。

在任何情况下,应用于引用类型的sizeof都不会提供引用的大小。所以不清楚你在做什么,因此无法解释正在发生的事情。

编辑

现在您已经展示了一些代码,我们可以回答这个问题:

您正在采用包含引用的类的大小。正如我上面所说,引用不是指针,但在必要时,编译器可能会回退到使用指针来表示它。当您创建包含引用的类时,编译器可以实现它的唯一(理智(方法是定义一个保存对象地址的类。在 32 位系统上,地址的宽度为 32 位或 4 个字节。所以sizeof这样的类(通常(是 4。