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。
然后再看引用的汇编代码,可以看到和指针是几乎一摸一样的操作,所以从底层来说引用是开了额外了空间的,引用是类似指针的方式实现的
引用和指针的不同点:
引用概念上定义一个变量的别名,指针存储一个变量地址。
引用在定义时必须初始化,指针没有要求
引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何 一个同类型实体
没有NULL引用,但有NULL指针
在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32
位平台下占4个字节)
引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
有多级指针,但没有多级引用
访问实体的方式不同,指针需要显式解引用,引用编译器会自己处理
引用比指针更加安全