在一台32位机器上,即使它是对double的引用,我总是得到{4}个引用的sizeof
,所以它真正存储在这4个字节中。
编辑:
class A{
public:
double& a;
};
int main(){
cout << sizeof(A) << endl; // this will print out 4
}
答案 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。