#include <iostream>
using namespace std;
class Test
{
double &num1;
public:
Test(double &num2):num1(num2)
{
cout<<sizeof(num1);//Prints 8
}
};
int main()
{
double num1=10;
Test t(num1);
cout<<sizeof(t);//Prints 4
return 0;
}
为什么sizeof()在为数据成员打印时和为对象打印时给出此结果?
答案 0 :(得分:2)
sizeof(t)
sizeof(Test)
是double&
加上任何填充的大小。在您的系统上,显然,存储的引用占用了4个字节,并且没有使用此类型的填充。
sizeof(num1)
是sizeof(double)
,因为当您命名引用时会发生什么:您实际上是引用引用的对象。
答案 1 :(得分:2)
sizeof
在应用于引用时返回引用类型的大小。这意味着在第一种情况下它返回sizeof(double)
。在第二种情况下,它返回类的大小,该类仅存储引用。
答案 2 :(得分:2)
来自http://en.cppreference.com/w/cpp/language/sizeof
应用于引用类型时,结果是引用类型的大小。
sizeof(num1)
是sizeof(double)
。
但
sizeof (Test)
是需要存储引用的地方,在您的情况下可能等同于sizeof (double*)
。
答案 3 :(得分:2)
num1
是一个参考,因此sizeof(num1)
给出了所引用对象的大小 - 这里是double
。
sizeof(T)
返回类的大小,而不是类成员可能引用的任何对象的大小。在这种情况下,类大小可能反映了引用被实现为double
的32位地址的事实。这是该语言没有说明的实现细节。
答案 4 :(得分:1)
您的类只是存储引用 - 因此编译器知道4个字节就足够了