理解lvalue和rvalue
来源:互联网 发布:excel处理大量数据 编辑:程序博客网 时间:2024/06/05 12:43
今天看C++模板的资料,里面说到lvalue,rvalue的问题,这个问题以前也看到过,也查过相关资料,但是没有考虑得很深,只知道rvalue不能取地址,不能赋值等等一些规则。今天则突然有了更深层次的理解(也可以说是顿悟,耗时不过几秒钟),记录下来。
下面是我对这两个单词字面的意思的猜测:
- lvalue估计来源于left value。 在赋值语句中lvalue = rvalue;位置处于左边。就是可以修改的值。
- rvalue估计来源于right value。处于赋值语句右边,是只读的不可修改的值。
接下来是我所悟到内容的详细分析
- lvalue是可以赋值的,说明它是一个变量,它在内存中一定存在,一定有地址。所以&lvalue是有效的,能取到在内存中的地址。
访问lvalue一定会导致CPU访问存储器(相对较慢的操作)。
lvalue的例子:
rvalue是不可以赋值的,它不是一个变量,在内存中没有存在,没有地址。它要么是存在于CPU的寄存器中,要么是存在于指令中(立即数)。所以只要对rvalue取地址,那么就一定是错误的(编译器会抱怨的)。
访问rvalue不会导致CPU访问存储器(对立即数和寄存器的访问很快)。
rvalue的例子:
- 函数的返回值是rvalue,对于返回int, char 等这样最基本的类型,是通过CPU寄存器返回的,因此返回值没有地址是可以理解的。但是如果函数返回的是一个用户自定义类型的对象,肯定不可能通过寄存器来返回这个对象值的(寄存器大小数量都有限,对象的大小可以非常大),那究竟是怎样返回对象的呢?
带着疑问,我查了查vc编译出来的代码,原来obj这个局部变量的地址被压入了堆栈,foo函数内部以堆栈上的obj地址作为this指针调用了UDT的构造函数。噢,难怪执行UDT obj = foo();这个语句只有调用了一次构造函数,而没有调用operator =,这都是因为函数返回值必须是rvalue这个规则所带来的好处,如果返回值是一个lvalue,那么这个语句一定会调用operator = 运算符。
- 理解lvalue和rvalue
- lvalue & rvalue
- lvalue & rvalue
- LValue RValue
- c语言中的lvalue和rvalue
- C++中rvalue和lvalue详悉
- lvalue and rvalue distanct
- lvalue 与 rvalue
- rvalue and lvalue
- lvalue and rvalue
- C和C++里面的lvalue 和 rvalue的释义
- lvalue和rvalue、传值和传引用、木桶
- lvalue和rvalue、传值和传引用、木桶
- 左值(lvalue)和右值(rvalue)
- 左值和右值(lvalue and rvalue)
- C++11中的rvalue references(一):左值和右值(lvalue and rvalue)
- 学习日志—lvalue/rvalue
- difference between lvalue and rvalue
- JAVA的辉煌还能延续多久
- oracle10g相关端口号
- 笔筒完成了一部分,上图
- tomcat 调优
- Clearcase Command Reference for config_spec
- 理解lvalue和rvalue
- 2011年5月10日中兴通讯实习生招聘笔试小记
- X86计算机系统的开机引导过程
- java 简单缓存机制
- GCC -l 指定链接库 参数详解
- 数据库效率 in是把外部和内表进行hash连接 exists是对外表做loop循环,然后每次loop循环再对内部进行查询
- 创建database link
- C51汇编伪指令(转载)
- 第10章 数据视图类(Item View Classes)