1.引用到底占不占内存?
占。
先看一段代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int x = 1;
int &b = x;
cout << &x << endl;
cout << &b << endl;
}
//0x6afef8
//0x6afef8
通过这个代码,我们发现x和b的地址一样的。
再看这段程序的汇编语言
9: int x = 1; //源代码
00401048 mov dword ptr [ebp-4],1 //反汇编代码
10: int &b = x; //源代码
0040104F lea eax,[ebp-4] //反汇编代码
00401052 mov dword ptr [ebp-8],eax//反汇编代码
在这里解释下这三行反汇编代码:
mov dword ptr [ebp-4],1 //把1赋值给ebp(栈底指针)-4的地址
lea eax,[ebp-4] //把ebp-4的地址赋值给寄存器eax
mov dword ptr [ebp-8],eax //把寄存器eax里的值赋值给ebp-8的这块地址
上述三行代码的作用就是将1赋值给x,然后将x的地址赋值给了引用b。
通过上面的分析,我们知道引用其实就是通过指针实现的,所占的内存大小就是指针的大小。
然后我们发现这两个结论是相悖的。
事实上,我们无法通过&b来获得b的地址,编译器会把&b编译成 &(*b) = &(x),所有我们看到了b的地址和x的地址相同。