此文缘起我看了这篇文章:
http://blog.csdn.net/newslxw/archive/2006/08/08/1038972.aspx

还记得当年读书时, 牛牛的C++老师告诉我: "引用, 其实就是别名, 与其所引用的对象完全等价". 可是, 我还是有这点疑问: "等价的含义, 是指的什么? 难道是说在最底层的实现上两者直接就是使用的同一个内存位置吗? " 比如下面的这段代码:

int main()
{
    int a = 100;
    int &b = a;
    int *c = &a;
    b = 99;
    a = 88;
    b = 77;
    *c = 66;

    return 0;
}

经过汇编后, 变成了这样:

main:
    leal    4(%esp), %ecx
    andl    $-16, %esp
    pushl    -4(%ecx)
    pushl    %ebp
    movl    %esp, %ebp
    pushl    %ecx
    subl    $16, %esp
.LCFI5:
    movl    $100, -16(%ebp)      ; ebp-16 为变量 a 的地址
    leal    -16(%ebp), %eax
    movl    %eax, -12(%ebp)      ; 将a的地址放在 ebp-12 地址处
    leal    -16(%ebp), %eax      
    movl    %eax, -8(%ebp)       ; ebp-8是指针c变量, 此句是给指针c赋值
    movl    -12(%ebp), %eax      ; 给引用b赋值前, 先把存在 ebp-12 的 a 的地址取到eax中
    movl    $99, (%eax)          ; b = 99 
    movl    $88, -16(%ebp)
    movl    -12(%ebp), %eax      ; 此处给引用b的赋值, 与前面一样, 也是先取a的地址
    movl    $77, (%eax)
    movl    -8(%ebp), %eax       ; 给*c赋值前, 先取c地址
    movl    $66, (%eax)          ; 此处执行 *c = 66
    movl    $0, %eax
    addl    $16, %esp
    popl    %ecx
    popl    %ebp
    leal    -4(%ecx), %esp
    ret

由此可见, 引用, 在具体实现时, 会申请一个临时空间(栈内空间), 目的是存放被引用对象的地址. 当使用引用变量时, 其实就是对被引用对象作了一次间接寻址. 而从汇编代码中来看, *c 确实与 b 在使用时的汇编代码一样, 都是先取地址, 再将值存入此地址. 所不同的, 只是在c++层面, 作为如 b 这样的引用类型变量, 只可在初始化时赋值, 且只能赋值一次.

小品: 关于C++引用相关推荐

  1. 第十九讲:爱情:如何让爱情天长地久 第二十讲:幽默 第二十一讲:爱情自尊

    (注:此为课程第十九课,更新于2017年7月16日) 大家好! 今天我们继续谈论爱情,讲之前先说一下,一位叫Nadia的同学,你的钥匙链落在这教室了,就在我这里,课后请来我这里取. 那我们来讲讲爱情吧 ...

  2. 长江后浪推前浪 被移动支付拍到沙滩上的行业有哪些?

    "长江后浪推前浪 前浪死在沙滩上"是青出于蓝而胜于蓝,人才倍出的意思,曾被无数小品.影视剧引用过.随着社会不断发展,新行业的兴起逐渐替代衰落的传统行业,就如"后浪把前浪拍 ...

  3. Go 学习笔记(65)— Go 中函数参数是传值还是传引用

    Go 语言中,函数参数传递采用是值传递的方式.所谓"值传递",就是将实际参数在内存中的表示逐位拷贝到形式参数中.对于像整型.数组.结构体这类类型,它们的内存表示就是它们自身的数据内 ...

  4. [JAVA EE] Thymeleaf 高级用法:模板布局,带参数的引用片段,表单验证,常用校验注解

    模板布局 公共部分通常定义为模板布局:如页眉,页脚,公共导航栏.菜单等. 模板布局定义方法 布局页中用 th:fragment 定义模板片段,其他页面用 th:insert 引用片段 例如:foote ...

  5. java 无法取消引用_Java的新手,并出现错误“无法取消引用int” - java

    我是java的新手,并且已经从事了一段时间,但是仍然收到错误消息:无法取消引用int.我看到了几个类似的问题,但仍然无法弄清自己的情况. 这是完整的代码: package inclass; class ...

  6. C++ 对象的声明与引用

    C++ 对象的声明的格式: 类名 对象名 (多个对象名之间用逗号隔开) 声明1个对象: People student; 声明多个对象 People student,student1,student2; ...

  7. Android 弱引用 (WeakReference)的使用

    1 弱引用 (WeakReference) 弱引用对象,这些对象不会阻止对其引用对象进行终结,终结和回收.弱引用最常用于实现规范化映射.假设垃圾收集器在某个时间点确定对象是弱可到达的.到那时,它将自动 ...

  8. Android 打包 aar文件的流程以及aar的引用

    打包aar 分为原项目打包成aar 和新建module 打包成aar 1 原项目打包成aar 文件 需要把项目先变成库 把apply plugin: 'com.android.application' ...

  9. 父类引用指向子类对象

    父类引用指向子类对象,如何访问子类的属性? 1.第一种办法最简单,强制类型转化为子类. 2.父类引用指向子类对象,由于当前引用为父类,只能访问父类的字段和方法,但是根据多态性可以访问子类的方法,在这个 ...

  10. postgreSQL外键引用查询 查询外键被那些表占用

    根据一个表名,查询所有外键引用它的表,以及那些外键的列名 key_column_usage(系统列信息表), pg_constraint(系统所有约束表) SELECT x.table_name,x. ...

最新文章

  1. ansible role中常代码块
  2. cpu使用率_单片机里面的CPU使用率是什么鬼?
  3. Spring.Net使用事务,try catch不回滚
  4. 虚拟化是什么,主要有哪些虚拟化技术?
  5. 屏幕录像专家 EXE视频转MP4
  6. c语言九宫格的递归算法,九宫格 数独 求解 算法 栈实现
  7. 公告栏文本横向循环滚动
  8. 计算机缓存设置方法,如何清除电脑缓存?清除电脑缓存方法介绍
  9. 绿纹龙的森林游记——UPC
  10. mysql group concat 去重,MySQL group_concat() 函数用法
  11. 解决input 中 type=“number“右侧上下箭头以及取消默认滚轮事件
  12. 地方政府不愿房价下跌 救市或化解房地产调控
  13. android 相机拍照返回,Android6.0机型上调用系统相机拍照返回的resultCode值始终等于0的问题...
  14. PCB做的 东南大学 校徽
  15. IPsec ACL隧道模式的路由设置
  16. SlickEdit 之windows 版本安装
  17. 偏微分方程数值解---学习总结(1)
  18. 【代码练习3】扑克洗牌发牌升级版
  19. 做一分钟经理之七(一分钟批评为什么有效)
  20. 【解决】/bin/bash^M: 坏的解释器: 文本文件忙

热门文章

  1. Salt: 2015.8.8.2 L@匹配BUG
  2. 戴文的Linux内核专题:08内核配置(4)
  3. jQuery技巧总结(转)作为JQuery学习总结
  4. jdk LinkedHashMap源码分析
  5. jdk String类源码解析
  6. 神经网络与深度学习2
  7. 【例题 8-3 UVA - 1152】4 Values whose Sum is 0
  8. Ubuntu屏幕录制工具【转】
  9. shell日期加减及数组循环
  10. Go Hack 2017 报名开启:十月魔都约一场 Go 语言烧脑之战