我们知道c++中变量其实是用于标识一段内存空间的,但我们将一个变量赋值给一个引用时,我们便可以通过引用来操作该变量对应的内存空间,用引用名来标识该段内存。直观来说引用就类似于别名。引用的生命周期依赖与所引用的对象,右值无法赋值给引用。
引用的本质到底是什么?引用是否占用了内存?占用了多大的内存?
将上面这段程序使用g++编译后的运行结果如下:
可以看到,引用也是占内存空间的,比如char 和char&一样占据了1个字节,但是为什么只有一个char&的成员的结构的大小会是8字节,按理应该也是1字节才对。使用objdump工具查看其反汇编后的程序:
从上图,可以看到先初始化var_2,将0x2 这个立即数放入 (-(0x11(%rbp))地址指向的内存中,然后初始化结构体ref_char,注意看,这里初始化是把(-(0x11(%rbp))放入了一段内存中,这就是说结构体里面存的实际上是一个地址,也就指针,所以打印结构体大小是8。char& 之所以是1 这只不过是编译器做的手脚,毕竟char& 引用的用处是标识一字节的内存,和char变量的用法是相同的,如果char& 得到的大小是8,就和实际应用意义有冲突了。
现在我们可以知道,引用实际上也是指针,只不过编译器帮我们屏蔽了底层的细节,让我们用起来更方便。