1.声明一个引用,编译器会为它分配一个内存吗?
答:并不会,引用的底层实现其实是一个指向相同变量的指针,但是套用一个老哥的话
指针信息是占用内存的,这部分内存是系统自动分配的,不需要你来操心它被放在哪里。通常我们说分配内存空间,是给你的变量内容使用的。你的变量可能是一串字符,一段文字,一个数值。这些是真正需要你分配空间的地方。
就像宾馆一样,来了客人,开了房,就等于分配空间了。当然登记簿上是记了一笔,但是这个登记簿是由宾馆来管理的。按照什么格式,记了什么东西是宾馆管理方自己规定的。你住进房间了,人家给你登记为某先生。一开始别人来找你都问某先上在吗?后来住长了服务员都知道你是某公司某总。那么从他们从客人备注里就写上了这个信息。今后一提某公司某总,就知道是你了。这就是引用。并没给你新开房,就是给你加一别名,往本子里记一笔而已。房间并没有变动。
int a = 1;//给a分配内存 保存1
int&b = a;//不会给b分配内存,b指向的就是a那个内存
所以总结就是,声明一个新的引用,编译器会分配一个指针地址生成一个指针,这个指针指向的是a,所以没有对变量分配一个新的内存,而是类似于创建了一个新的指针
2.在结构体中,引用占用多少字节?
首先有如下的结构体,这里我们以32位编译器为例
struct Test {
int a;
int&b = a;
};
编译结果为8,这说明编译器在int&b = a;
这一行生成了一个4字节的地址,但是我们知道一个32位系统指针和int类型占用的内存大小都是4字节,那么这个4字节到底表示的是指针还是一个新的整型变量b呢?
如上第一个问题所答,我们应该知道这个4字节应该表示的是一个指针,这里我们来验证一下
struct ab {
int a;
int& b;
double &d;
};
int main()
{
cout << sizeof(ab);
}
我们新加一个double类型的指针,然后调用sizeof()对结构体ab求大小,编译结果为12,这说明double& b确实是分配的一个指针大小,而不是一个新的double变量,如果分配的是新的double类型地址,那么结果应该是16.
3.总结
指针需要分配内存空间;引用不需要分配内存空间
指针是一个变量,存储的内容为一个地址;引用是给一个已有对象起的别名
指针是间接访问,引用是直接访问
新建一个引用,编译器并没有给链接到的那个变量分配一个新的内存保存源变量的内容,而是分配一个内存保存指向源变量的指针罢了。