小品: 关于C++引用
此文缘起我看了这篇文章:
http://blog.csdn.net/newslxw/archive/2006/08/08/1038972.aspx
还记得当年读书时, 牛牛的C++老师告诉我: "引用, 其实就是别名, 与其所引用的对象完全等价". 可是, 我还是有这点疑问: "等价的含义, 是指的什么? 难道是说在最底层的实现上两者直接就是使用的同一个内存位置吗? " 比如下面的这段代码:
{
int a = 100;
int &b = a;
int *c = &a;
b = 99;
a = 88;
b = 77;
*c = 66;
return 0;
}
经过汇编后, 变成了这样:
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++引用相关推荐
- 第十九讲:爱情:如何让爱情天长地久 第二十讲:幽默 第二十一讲:爱情自尊
(注:此为课程第十九课,更新于2017年7月16日) 大家好! 今天我们继续谈论爱情,讲之前先说一下,一位叫Nadia的同学,你的钥匙链落在这教室了,就在我这里,课后请来我这里取. 那我们来讲讲爱情吧 ...
- 长江后浪推前浪 被移动支付拍到沙滩上的行业有哪些?
"长江后浪推前浪 前浪死在沙滩上"是青出于蓝而胜于蓝,人才倍出的意思,曾被无数小品.影视剧引用过.随着社会不断发展,新行业的兴起逐渐替代衰落的传统行业,就如"后浪把前浪拍 ...
- Go 学习笔记(65)— Go 中函数参数是传值还是传引用
Go 语言中,函数参数传递采用是值传递的方式.所谓"值传递",就是将实际参数在内存中的表示逐位拷贝到形式参数中.对于像整型.数组.结构体这类类型,它们的内存表示就是它们自身的数据内 ...
- [JAVA EE] Thymeleaf 高级用法:模板布局,带参数的引用片段,表单验证,常用校验注解
模板布局 公共部分通常定义为模板布局:如页眉,页脚,公共导航栏.菜单等. 模板布局定义方法 布局页中用 th:fragment 定义模板片段,其他页面用 th:insert 引用片段 例如:foote ...
- java 无法取消引用_Java的新手,并出现错误“无法取消引用int” - java
我是java的新手,并且已经从事了一段时间,但是仍然收到错误消息:无法取消引用int.我看到了几个类似的问题,但仍然无法弄清自己的情况. 这是完整的代码: package inclass; class ...
- C++ 对象的声明与引用
C++ 对象的声明的格式: 类名 对象名 (多个对象名之间用逗号隔开) 声明1个对象: People student; 声明多个对象 People student,student1,student2; ...
- Android 弱引用 (WeakReference)的使用
1 弱引用 (WeakReference) 弱引用对象,这些对象不会阻止对其引用对象进行终结,终结和回收.弱引用最常用于实现规范化映射.假设垃圾收集器在某个时间点确定对象是弱可到达的.到那时,它将自动 ...
- Android 打包 aar文件的流程以及aar的引用
打包aar 分为原项目打包成aar 和新建module 打包成aar 1 原项目打包成aar 文件 需要把项目先变成库 把apply plugin: 'com.android.application' ...
- 父类引用指向子类对象
父类引用指向子类对象,如何访问子类的属性? 1.第一种办法最简单,强制类型转化为子类. 2.父类引用指向子类对象,由于当前引用为父类,只能访问父类的字段和方法,但是根据多态性可以访问子类的方法,在这个 ...
- postgreSQL外键引用查询 查询外键被那些表占用
根据一个表名,查询所有外键引用它的表,以及那些外键的列名 key_column_usage(系统列信息表), pg_constraint(系统所有约束表) SELECT x.table_name,x. ...
最新文章
- ansible role中常代码块
- cpu使用率_单片机里面的CPU使用率是什么鬼?
- Spring.Net使用事务,try catch不回滚
- 虚拟化是什么,主要有哪些虚拟化技术?
- 屏幕录像专家 EXE视频转MP4
- c语言九宫格的递归算法,九宫格 数独 求解 算法 栈实现
- 公告栏文本横向循环滚动
- 计算机缓存设置方法,如何清除电脑缓存?清除电脑缓存方法介绍
- 绿纹龙的森林游记——UPC
- mysql group concat 去重,MySQL group_concat() 函数用法
- 解决input 中 type=“number“右侧上下箭头以及取消默认滚轮事件
- 地方政府不愿房价下跌 救市或化解房地产调控
- android 相机拍照返回,Android6.0机型上调用系统相机拍照返回的resultCode值始终等于0的问题...
- PCB做的 东南大学 校徽
- IPsec ACL隧道模式的路由设置
- SlickEdit 之windows 版本安装
- 偏微分方程数值解---学习总结(1)
- 【代码练习3】扑克洗牌发牌升级版
- 做一分钟经理之七(一分钟批评为什么有效)
- 【解决】/bin/bash^M: 坏的解释器: 文本文件忙