为什么引用大小总是4个字节 - c ++

时间:2012-05-04 10:18:14

标签: c++ reference

在一台32位机器上,即使它是对double的引用,我总是得到{4}个引用的sizeof,所以它真正存储在这4个字节中。

编辑:

class A{
public:
  double&  a;
};

int main(){
  cout << sizeof(A) << endl; // this will print out 4
}

2 个答案:

答案 0 :(得分:38)

标准在sizeof(C ++ 11,5.3.3 / 4)上非常清楚:

  

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

因此,如果你真的在使用sizeof(double&),编译器会告诉你sizeof(double)是4。

更新:因此,您真正要做的是将sizeof应用于类类型。在那种情况下,

  

当应用于类时,结果是一个字节数   该类的对象[...]

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

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

请记住,引用的概念与任何特定实现无关。该标准允许编译器实现它想要的引用。

答案 1 :(得分:21)

你不能,也不是。

C ++引用不是指针。它是对象的别名。 有时,编译器选择使用指针实现它。但通常,它通过根本不做任何事情来实现它。只需生成直接引用原始对象的代码即可。

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

修改

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

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