C++引用(&)笔记

简介: C++引用(&)笔记

C++引用(&)笔记

image.png


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


image.png


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


image.png


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


正确表达:


image.png


3.临时变量具有常性


image.png


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


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


image.png


为什么要有临时变量?


image.png


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


4.引用是否开了空间?


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


image.png


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


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


引用和指针的不同点:


引用概念上定义一个变量的别名,指针存储一个变量地址。

引用在定义时必须初始化,指针没有要求

引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何 一个同类型实体

没有NULL引用,但有NULL指针

在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32

位平台下占4个字节)


引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小

有多级指针,但没有多级引用

访问实体的方式不同,指针需要显式解引用,引用编译器会自己处理

引用比指针更加安全


目录
相关文章
|
6月前
|
算法 C++
算法笔记:递归(c++实现)
算法笔记:递归(c++实现)
|
6月前
|
编译器 C++
《Effective C++ 改善程序与设计的55个具体做法》 第一章 笔记
《Effective C++ 改善程序与设计的55个具体做法》 第一章 笔记
|
4月前
|
C++ 容器
【C/C++笔记】迭代器
【C/C++笔记】迭代器
29 1
|
5月前
|
存储 安全 C++
浅析C++的指针与引用
虽然指针和引用在C++中都用于间接数据访问,但它们各自拥有独特的特性和应用场景。选择使用指针还是引用,主要取决于程序的具体需求,如是否需要动态内存管理,是否希望变量可以重新指向其他对象等。理解这二者的区别,将有助于开发高效、安全的C++程序。
38 3
|
4月前
|
存储 安全 程序员
【C/C++笔记】迭代器范围
【C/C++笔记】迭代器范围
73 0
|
5月前
|
C++ Windows
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
在Windows上使用Visual Studio 2022进行FFmpeg和SDL2集成开发,首先安装FFmpeg至E:\msys64\usr\local\ffmpeg,然后新建C++控制台项目。在项目属性中,添加FFmpeg和SDL2的头文件及库文件目录。接着配置链接器的附加依赖项,包括多个FFmpeg及SDL2的lib文件。在代码中引入FFmpeg的`av_log`函数输出"Hello World",编译并运行,若看到"Hello World",即表示集成成功。详细步骤可参考《FFmpeg开发实战:从零基础到短视频上线》。
231 0
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
|
5月前
|
存储 自然语言处理 编译器
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
|
6月前
|
存储 安全 编译器
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
69 5
|
6月前
|
C++
C++引用
C++引用
|
6月前
|
存储 安全 编译器
【C++入门】—— C++入门 (中)_引用
【C++入门】—— C++入门 (中)_引用
40 5