引用和指针有什么区别?引用在进程中是否会分配内存?

C++ primer中说: 引用就是对象的另一个名字。
C++ primer中说: 指针用于指向对象,保存的是另一个对象的地址。 从字面意义上,感觉引用并没有分配内存,而指针是分配了内存的,于是写了个小程序进行测试。 int main()
{
long val = ;
long &r_val = val;
const long &const_r_val = val;
const long &const_r_tmp = ;
long *p_val = &val;
printf("val address: 0x%lx\n", &val);
printf("r_val address: 0x%lx\n", &r_val);
printf("const_r_val address: 0x%lx\n", &const_r_val);
printf("const_r_tmp address: 0x%lx\n", &const_r_tmp);
printf("p_val address: 0x%lx\n", &p_val);
void *tmp;
tmp = &r_val;
const void *const_tmp;
const_tmp = &const_r_tmp;
tmp = &p_val;
return ;
}
采用g++编译得到如下结果: val address: 0x7fff7377ee48
r_val address: 0x7fff7377ee48
const_r_val address: 0x7fff7377ee48
const_r_tmp address: 0x7fff7377ee50
p_val address: 0x7fff7377ee40
可以看出对引用取地址(&)跟变量取地址(&)都是得到同一个地址值,而对指针取地址(&)得到的是另外一个地址,好像引用真的没有分配内存,这是真的吗???? 其实上不然,从C++语义上说,引用就是对象的另一个名字,并没有具体的指定另一个名字的具体实现,根据编译器的不同,引用的实现也不一样。 我们通过objdump –d a.out进行反编译可知: long val = ;
movq $0x1,0xffffffffffffffe8(%rbp)//将立即数1复制给val所在的内存
long &r_val = val;
lea 0xffffffffffffffe8(%rbp),%rax//将val所在的内存地址赋值给rax
mov %rax,0xfffffffffffffff0(%rbp)//将rax赋值给r_val所在的内存
long *p_val = &val;
lea 0xffffffffffffffe8(%rbp),%rax//将val所在的内存地址赋值给rax
mov %rax,0xffffffffffffffe0(%rbp)//将rax赋值给p_val所在的内存
我们可以看出实际上指针和引用的在g++编译器中的实现是一样的,既然分配了内存,为何&r_val == &val ? 我们来继续看看反汇编代码: tmp = &r_val;
mov 0xfffffffffffffff0(%rbp),%rax//将r_val变量中存的内存地址赋值给rax
mov %rax,0xfffffffffffffff8(%rbp)//将rax的值赋值给了tmp
tmp = &p_val;
lea 0xffffffffffffffe0(%rbp),%rax//将p_val的内存地址赋值给了rax
mov %rax,0xfffffffffffffff8(%rbp)//将rax的值赋值给了tmp
对于取地址运算(&),g++编译器对于引用和其他变量的处理是不一样的,引用调用的汇编指令mov,得到引用所在内存存储的变量内存地址,而其他变量的取地址(&)运算调用的是汇编指令lea,得到变量本身的存储地址,于是有了引用不分配内存的假象。 上述分析针对于linux下的g++编译器,传说在VC中进行编译会得到不同的结果,在debug编译下,引用是会分配内存的,而在release编译下,引用不分配内存,直接调用变量,有兴趣的童鞋可以去试试。

最新文章

  1. 项目: 推送水木文章到Kindle
  2. Java中使用Collections.sort()方法对数字和字符串泛型的LIst进行排序
  3. jQuery跨域
  4. Xcode 中 Git 的配置与使用
  5. STM32F0xx_FLASH编程(片内)配置详细过程
  6. 由一位坛友的布局想到的定位问题:absolute和relative
  7. 【二分答案+贪心】解决“最小值最大”问题(UVa 12124 - Assemble)
  8. 如何运行一个vue工程
  9. Xamarin.Forms 开发资源集合
  10. python 多线程共享全局变量的问题
  11. Java高级特性 第10节 IDEA和Eclipse整合JUnit测试框架
  12. Oracle数据库里面查询字符串类型的字段不为空和为空的SQL语句:
  13. 牛客网数据库SQL实战(1-5)
  14. Linux系统声卡问题
  15. Keras学习笔记。
  16. Android 编程下 Eclipse 恢复被删除的文件
  17. GetLastError结果列表
  18. soj1036. Crypto Columns
  19. JavaScript中自定义函数以及文本框、radio、下拉框的值的获取,结合淘宝竞拍案例来理解。。。
  20. java获取每月的最后一天

热门文章

  1. LeetCode:螺旋矩阵【54】
  2. OpenGL学习进程(8)第六课:点、边和图形(三)绘制图形
  3. Linux Shell基础 read命令
  4. 把Android原生的View渲染到OpenGL Texture
  5. Eclipse Class Decompiler——Java反编译插件
  6. 【转载】linux下使用 TC 对服务器进行流量控制
  7. Qt下TCP编程
  8. GDKOI2017游记
  9. windows系统JDK的安装及环境配置
  10. linux下 stat statfs 获取 文件 磁盘 信息