C++引用(&)笔记

C++引用(&)笔记

1.寄存器一般只有4/8个字节,所以返回时候的中间变量(下图的临时变量)不一定是储存在寄存器当中

2.传引用返回可以减少拷贝,增加效率

但运行打印会出错的,因为当栈帧销毁的时候,清理栈帧就会得到随机值

正确表达:

3.临时变量具有常性

这样的代码是无法通过编译的,因为这里涉及到了一个权限的放大,因为对于引用来说,权限不能被放大,只能权限缩小/平移

这里的临时变量a具有常性,所以它的类型其实是const double,从const double转换到了int这里是一个权限的缩小,所以会报错,如果改成const int &c=a;就可以通过编译了。

为什么要有临时变量?

这里的ij进行比较的时候,由于类型不同,需要对类型进行提升,一般是由小变大,比如这里的int就要提升到double才能进行比较,而这里的提升是对原变量i进行提升吗?如果因为一个比较而修改原来的变量类型那不是乱套了吗?所以这里会生成一个临时变量,然后对临时变量的类型进行提升,提升之后再与j进行比较。

4.引用是否开了空间?

从语法的层面上来说它是没有开空间的,它就是变量的别名,那么从汇编的角度来看呢?

先看指针pa的汇编代码:首先是将a的地址存在寄存器eax当中,然后再将eax(存的a的地址)给pa,然后把pa的地址给寄存器eax[eax]就是对eax进行解引用,把1Eh(30)eax

然后再看引用的汇编代码,可以看到和指针是几乎一摸一样的操作,所以从底层来说引用是开了额外了空间的,引用是类似指针的方式实现的

引用和指针的不同点:

  1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
  2. 引用在定义时必须初始化,指针没有要求
  3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何 一个同类型实体
  4. 没有NULL引用,但有NULL指针
  5. sizeof中含义不同引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32

位平台下占4个字节)

  1. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
  2. 有多级指针,但没有多级引用
  3. 访问实体的方式不同,指针需要显式解引用,引用编译器会自己处理
  4. 引用比指针更加安全

猜你喜欢

转载自blog.csdn.net/AkieMo/article/details/130661739