- 主题:c++真是快被标准委员会玩成花了啊
就他妈一move语义,别的语言里多面简单,直接一个引用类型搞定
这c++, 一会左值一会右值, 一会拷贝构造,一会移动构造
一会 std::move一会 std::forward
真是够了啊,还没 qt 的对象实现优雅直接
多么恶心的语言,恶心的特征
做了多少年的孽,为了补救,再泼上一堆屎
腐朽的语言,让他死去吧
--
FROM 221.219.211.*
拷贝、移动,这在Rust里也有,因为这玩意儿决定了效率,才要搞这个区分,把决定权交给码农,码农知道什么情况下该拷贝,什么情况下该移动。懒的码农,其实可以无脑用shared_ptr的,哈哈,当然,出现内存泄漏啥的就别怪了。
std::forward那个跟模板参数推导有关,不用模板的话,用不着。
--
修改:z16166 FROM 125.35.123.*
FROM 125.35.123.*
哈哈,相比于其它的改动,move语义还算是比较必要的补丁了。
就不知道为啥C++标准委员会要给C++增加那么多新的功能。
【 在 iwantfly 的大作中提到: 】
: 就他妈一move语义,别的语言里多面简单,直接一个引用类型搞定
: 这c++, 一会左值一会右值, 一会拷贝构造,一会移动构造
: 一会 std::move一会 std::forward
: ...................
--
FROM 58.33.81.*
是不是得理解内存模型才能理解这几个概念
【 在 z16166 的大作中提到: 】
: 拷贝、移动,这在Rust里也有,因为这玩意儿决定了效率,才要搞这个区分,把决定权交给码农,码农知道什么情况下该拷贝,什么情况下该移动。懒的码农,其实可以无脑用shared_ptr的,哈哈,当然,出现内存泄漏啥的就别怪了。
: std::forward那个跟模板参数推导有关,不用模板的话,用不着。
--
FROM 114.249.23.*
首先得和值语义、结构体按值存储的语言对标。这样流行语言只有c,go,rust,d之类几个。其中go、d用gc,省太多事了,go甚至只要取了指针就分配在堆上,new都是虚化的关键字。这就是设计选择了,对一般内存效率、极端内存效率、抽象能力和易用性方面的权衡选择。
【 在 iwantfly 的大作中提到: 】
: 就他妈一move语义,别的语言里多面简单,直接一个引用类型搞定
: 这c++, 一会左值一会右值, 一会拷贝构造,一会移动构造
: 一会 std::move一会 std::forward
: ...................
--
FROM 114.254.10.*
这几个跟内存模型无关,copy/move是性能考虑,forward纯粹是模板推导的需要。
跟内存模型有关的主要是锁、无锁。
【 在 littleSram 的大作中提到: 】
: 是不是得理解内存模型才能理解这几个概念
--
FROM 125.35.123.*
我表达有误,是不是和栈结构以及寄存器有关
就像go语言一样,以前用栈传参,现在新版本改成用寄存器传参
【 在 z16166 的大作中提到: 】
: 这几个跟内存模型无关,copy/move是性能考虑,forward纯粹是模板推导的需要。
: 跟内存模型有关的主要是锁、无锁。
:
--
FROM 114.249.23.*
非也
【 在 littleSram 的大作中提到: 】
: 我表达有误,是不是和栈结构以及寄存器有关
: 就像go语言一样,以前用栈传参,现在新版本改成用寄存器传参
: :
--
FROM 125.35.123.*
不需要到这一层
是不是理解了对象所有权就够了
【 在 z16166 的大作中提到: 】
: 非也
:
--
FROM 114.249.23.*
copy/move涉及的是对象内部的数据/状态的复制、转移操作,跟对象的所有权不是一回事。
比如:
对象A内部分配了一个内存缓冲区保存在其成员m_ptr里:
A.m_ptr = new char[12];
对象B如果来copy对象A的话,B内部的m_ptr指向的是一个新分配的内存,而且两个缓冲区内的数据用memcpy搞得完全一样:
B.m_ptr = new char[12];
memcpy(B.m_ptr, A.m_ptr, 12);
对象B如果要由A move得来的话,A内部的缓冲区会转移给B,然后A内部只剩下个空指针:
B.m_ptr = A.m_ptr
A.m_ptr = nullptr;
对比一下上面的copy构造、move构造操作,就知道copy和move哪个操作效率高了。当然前提是在能move的场景下。
用 B{A}; 来声明B的意思就是告诉编译器调用copy ctor
而用 B{std::move(A)}; 来声明B的意思就是告诉编译器调用move ctor。决定权在码农。
【 在 littleSram 的大作中提到: 】
: 不需要到这一层
: 是不是理解了对象所有权就够了
: :
--
修改:z16166 FROM 125.35.123.*
FROM 125.35.123.*