左值右值,有没有通俗易懂且具体的资料

2022-01-11 17:49:04 +08:00
 ligiggy

看了几篇文档了

比如巨硬的这个: Lvalues and Rvalues

比如 cpprefrence 的这个: value categories

3882 次点击
所在节点    C++
38 条回复
mainjzb
2022-01-11 18:06:57 +08:00
右值就是临时变量为了减少拷贝生产的
例如
int Test(){
return 100;
}

int main(){
auto t = Test();
}
整个过程只有生成一个 100 ,没有发生任何拷贝。如何做到这一点。就是让编译器知道 100 是右值。他可以直接把所有权交给 m 不用再拷贝。

int Test(){
int x = 100;
return x;
}

int main(){
auto t = Test();
}
因为 x 是左值。所以产生了一次拷贝。
mainjzb
2022-01-11 18:09:49 +08:00
以前的 C++ 2 种情况都会拷贝一次。为了解决这种没用的拷贝才发明的这堆名词。
anonymousar
2022-01-11 18:20:53 +08:00
modern effective c++ 里面写的很清楚了
Coelacanth
2022-01-11 19:57:02 +08:00
看 stackoverflow 上面的最高赞回答,应该是最通俗的。
yulon
2022-01-11 20:36:21 +08:00
有名字的就是左值,不要光看声明,有名字的右值引用也是左值。

1L 是不对的,两种情况完全一样,左值也可以不拷贝,因为有 RVO ,而且基础类型只有拷贝这一种情况,除非被优化掉,优化的也不是变量,而是函数被优化成内联。
leido
2022-01-11 21:01:13 +08:00
能写在等号左边的就是左值 (逃
majula
2022-01-11 21:38:54 +08:00
@leido 谭浩强给你点了个赞(
6david9
2022-01-11 21:45:38 +08:00
把变量想象成一个箱子,存在变量里的就是右值,可以存其他东西的“箱子”就是左值。
变量和变量里的值。
GeruzoniAnsasu
2022-01-11 21:46:08 +08:00
> 比如 cpprefrence 的这个: https://en.cppreference.com/w/cpp/language/value_category


----

那么你看这个了吗: https://zh.cppreference.com/w/cpp/language/value_category

没开玩笑,如果你觉得英文版还不够通俗易懂,有翻译好的中文版而且质量没什么问题,别因为莫名其妙的「鄙视感」忽略它。

c++中值类别的最大作用或者说区分它的意义就是用来判定能否「减少复制」(无论 copy elision 还是 move semantics )。我相信凡是写过 c++代码的人都一定对「对象复制」有一些直觉,标准中去界定这些值类型只不过把你想到或没想到的地方都公理化了而已



还有,别看 c++11 了,直接从 c++17 看起。c++11 作为 morden c++的第一个版本很多地方都是不成熟的
statumer
2022-01-11 22:13:34 +08:00
歪个楼,C++的 value category ,prvalue ,glvalue ,rvalue ,guaranteed copy elision 的重大意义就是解决了其他语言根本不存在的问题,那就是 s=s1+s2 中这个=如何实现的问题。
leimao
2022-01-12 00:17:22 +08:00
Jooooooooo
2022-01-12 00:28:17 +08:00
我一直很好奇, c 里面如此奇葩的东西怎么没人喷呢, 反而是 java 里那些无关紧要的东西被喷的要死.
msg7086
2022-01-12 01:49:37 +08:00
@Jooooooooo
Java 用的人更多一些。
C 和 C++更古老一些,历史包袱比较多,而且更贴近硬件,对性能要求更高。
(当然 Java 也有很多历史包袱(著名的泛型……

在其他语言里,赋值的时候复制一下内存可能睁一只眼闭一只眼也就算了,但是在 C/C++环境里,遇到计算密集的场景,对这些「浪费」就会非常敏感。少复制一块内存,少产生一个无用指令集,在生产环境里可能就会带来数万元甚至更多的收益。所以大家更喜欢在细节处抠性能。
shineit
2022-01-12 08:43:38 +08:00
还要看应用场景:左值引用 /右值引用
crackhopper
2022-01-12 08:51:29 +08:00
crackhopper
2022-01-12 08:52:46 +08:00
cppreference 里很多说明跟 c++标准差不多。想搞明白挺难的。不过反复琢磨会提高理解是深度。
ligiggy
2022-01-12 09:15:43 +08:00
@Jooooooooo c++无时无刻都在重视性能
ligiggy
2022-01-12 09:16:44 +08:00
@crackhopper
@leimao
感谢两位大佬的分享!
powerman
2022-01-12 09:23:48 +08:00
@msg7086 这些场景现在越来越少了,基本上跟整个软件产业来讲,约等于无了
powerman
2022-01-12 09:48:40 +08:00
@msg7086 现在新项目 能用 rust 的很多 都在 rust 了,有一定性能要求,能忍受 GC 停顿的,都选 golang ,除了一些历史遗留,新东西以后会越来越少使用 C++

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/827635

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX