希望我们不仅把编程当成一份工作,更要将其当成一份热爱!!!
-----潜意识中有个想成为一名厉害的程序员的梦
一、前言
学习右值引用的时候,看了很多文章,但一直感觉学的有点模糊,好像懂了,又好像没懂。特意去用汇编从底层研究了一下右值引用。临近秋招其实自己准备的还差很多,但还是在求知欲以及自己的倔强劲驱使下花了半个上午,一下午研究了一下,咱就是说:挺心疼时间的,呜呼!!!
提别提示:本文内容,为本人通过汇编实践而得,不代表官方,不代表正确。
二、什么是引用、左值引用、右值引用?-表层含义
借用一下菜鸟教程对引用的解释:
引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。
但是我觉得这个应该是左值引用的定义,而非引用的定义。我来给引用重新下一个定义:
什么是引用?
引用是给一块内存空间起一个名字。这块内存空间本来就有一个名字,或者没有名字。
什么是左值引用?
给一个本来就有名字的内存空间另外起一个名字。
什么是右值引用?
给一个本来没有名字的内存空间起一个名字。
三、什么是引用、左值引用、右值引用?-底层剖析
从底层角度定义引用、左值引用、右值引用。以下为自己定义,非官方:
什么是引用?--底层含义
引用是定义一个指针,该指针指向一块内存空间。这块内存空间本来就有一个名字,或者没有名字。
什么是左值引用?--底层含义
左值引用是定义一个指针,该指针指向一块本来就有一个名字的内存空间。
什么是右值引用?--底层含义
右值引用是定义一个指针,该指针指向一块没有名字的内存空间。
左值引用底层剖析
观察以下代码,左侧是源码,右侧是其汇编代码(懒得看汇编的话,直接看我下文描述就行):
| |
上述汇编的代码逻辑是:开辟12字节内存空间,其中四个字节为变量a的内存空间,并赋值为1。另外8个字节(64位系统)为引用b(准确说应该叫指针b)的内存空间,其内容为a的内存空间的地址。假设此时栈帧地址为100,如图所示:
根据上述底层剖析,所以我说:
什么是左值引用?--底层含义
左值引用是定义一个指针,该指针指向一块本来就有一个名字的内存空间。
未完待续...