19

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

编辑 :

class A{
public:
  double&  a;
};

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

2 回答 2

47

sizeof该标准在(C++11, 5.3.3/4)上非常明确:

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

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

更新:所以,你真正在做的是申请sizeof一个类类型。在这种情况下,

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

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

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

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

于 2012-05-04T10:21:59.927 回答
29

你不能,事实并非如此。

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

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

编辑

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

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

于 2012-05-04T10:22:49.087 回答