考虑以下程序:
#include <stdio.h>
struct A
{
int x;
};
int main()
{
printf("%d\n", sizeof(A));
return 0;
}
按预期,此程序将打印数字4
,因为A
中的整数使用4个字节。但是,让我们将程序更改为:
#include <stdio.h>
struct A
{
int x;
int& r = x;
};
int main()
{
printf("%d\n", sizeof(A));
return 0;
}
现在程序将打印数字16
。
一直有人告诉我,C ++中的引用就像别名一样,就像为同一变量提供另一个名称一样。因此,我希望该结构仍具有4个字节的大小,因为引用r
只是x
的另一个名称,在编译时它将被实际的变量x
取代。 / p>
很奇怪,事实并非如此。相反,似乎引用占用的内存与指针占用的内存一样多。如果将int& r = x;
更改为int* p = &x;
,程序还将打印16
。在我看来,这没有任何意义,因为为什么要像引用一样占用内存,为什么还要有引用,所以我们可能只使用指针。
我用以下代码又做了一个测试程序:
#include <stdio.h>
struct A
{
int x;
int y;
int z;
int& X = x;
int& Y = y;
int& Z = z;
};
int main()
{
printf("%d\n", sizeof(A));
return 0;
}
上面的程序将打印40
。在我看来,这很奇怪,因为3个整数每个应该占用4个字节,总共12个字节,剩下28个字节供参考。但是28不能被3整除。
我已经使用x64配置的Visual Studio 2015对此进行了编译。
所以我的问题是:我在这里做错了什么,还是为什么C ++引用会耗尽结构中的内存?