C++引用(&)笔记
1.寄存器一般只有4/8个字节,所以返回时候的中间变量(下图的临时变量)不一定是储存在寄存器当中
2.传引用返回可以减少拷贝,增加效率
但运行打印会出错的,因为当栈帧销毁的时候,清理栈帧就会得到随机值
正确表达:
3.临时变量具有常性
这样的代码是无法通过编译的,因为这里涉及到了一个权限的放大
,因为对于引用
来说,权限不能被放大,只能权限缩小/平移
这里的临时变量a
具有常性,所以它的类型其实是const double
,从const double
转换到了int
这里是一个权限的缩小,所以会报错,如果改成const int &c=a;
就可以通过编译了。
为什么要有临时变量?
这里的i
和j
进行比较的时候,由于类型不同,需要对类型进行提升,一般是由小变大,比如这里的int
就要提升到double
才能进行比较,而这里的提升是对原变量i
进行提升吗?如果因为一个比较而修改原来的变量类型那不是乱套了吗?所以这里会生成一个临时变量,然后对临时变量的类型进行提升,提升之后再与j
进行比较。
4.引用是否开了空间?
从语法的层面上来说它是没有开空间的,它就是变量的别名,那么从汇编的角度来看呢?
先看指针pa
的汇编代码:首先是将a
的地址存在寄存器eax
当中,然后再将eax
(存的a的地址)给pa
,然后把pa
的地址给寄存器eax
,[eax]
就是对eax
进行解引用,把1Eh(30)
给eax
。
然后再看引用的汇编代码,可以看到和指针是几乎一摸一样的操作,所以从底层来说引用是开了额外了空间的,引用是类似指针的方式实现的
引用和指针的不同点:文章来源:https://www.toymoban.com/news/detail-442786.html
- 引用概念上定义一个变量的别名,指针存储一个变量地址。
- 引用在定义时必须初始化,指针没有要求
- 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何 一个同类型实体
- 没有NULL引用,但有NULL指针
- 在
sizeof
中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)文章来源地址https://www.toymoban.com/news/detail-442786.html
- 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
- 有多级指针,但没有多级引用
- 访问实体的方式不同,指针需要显式解引用,引用编译器会自己处理
- 引用比指针更加安全
到了这里,关于C++引用(&)笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!