在 32 位机器上,我总是得到sizeof
4 个字节的引用,即使它是对双精度的引用,那么它在这 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&
在你的脸上称它为 a。
因此,如果您的体系结构是 32 位(其中指针长度为 4 个字节),则可以解释结果。
请记住,引用的概念与任何特定实现无关。该标准允许编译器根据需要实现引用。
你不能,事实并非如此。
C++ 引用不是指针。它是对象的别名。有时,编译器选择使用指针来实现这一点。但通常,它通过什么都不做来实现它。通过简单地生成直接引用原始对象的代码。
在任何情况下,sizeof
应用于引用类型都不会为您提供引用的大小。因此,您在做什么并不是很清楚,因此无法解释正在发生的事情。
编辑
现在您已经展示了一些代码,我们可以回答这个问题:
您正在获取包含引用的类的大小。正如我上面所说,引用不是指针,但在必要时,编译器可能会退回到使用指针来表示它。当您创建一个包含引用的类时,编译器可以实现它的唯一(理智)方法是定义一个包含对象地址的类。在 32 位系统上,地址为 32 位或 4 字节宽。所以sizeof
这样的班级(通常)是4。