C++中的移动语义起源是什么?

6
我想知道C++中move semantics的起源是什么?特别是它是为这种语言专门发明的,还是其他语言中有类似的东西?在后一种情况下,你能给一些参考资料吗?

或许 C++11 中采用 move 语义的最重要原因之一是因为在 C++03 中缺乏 move 语义,这在 auto_ptr 的非正式实现中表现得十分明显。显然,由于缺乏语言支持而无法干净地完成某些想做的事情,这是很明显的。 - Kerrek SB
3
移动语义自从人们开始编程就一直存在,但都是手工实现的。引入移动语义作为一种语言特性,是为了将“可移动性”这一概念编码到类型系统中,以便编译器可以决定何时“移动”东西,以及用户定义的类型如何声明它们的可移动性。C++中的移动语义是C++强调在类型系统中编码信息的产物。我不知道早期的编程语言是否和C++一样强调类型系统。 - bames53
@bames53:那可能是一个很好的答案。 - Lightness Races in Orbit
@LightnessRacesinOrbit 我对历史语言的了解不够自信。然而,你在回答中提供的建议并未承认以前的语言,这似乎是相当有力的证据,所以我投票支持了你的回答 :) - bames53
@bames53:说实话,如果你把你的第一条评论写成回答,而我是提问者,我就会接受它 :) - Lightness Races in Orbit
1
C++的粉丝们对于那些不断批评他们所钟爱的语言存在过多值复制的人感到很烦恼,因此他们发明了一些语义来避免一些复制,并称之为“移动”。 :) - Martin James
2个回答

7
似乎没有任何特定的概念祖先。C++移动语义的起源,如原始提案中所述,是在新闻组中讨论的:
“多种形式的移动语义已经在C++论坛(尤其是comp.lang.c++.moderated)中讨论了多年。”
在我看来,它们与C++中左值和右值的概念紧密相连,如果我没有弄错的话,这纯粹是一个C++的概念。一个没有左值、右值及其新的C++11朋友的语言不需要像C++实现的那样使用移动语义。
然而,更普遍地说,将东西移动而不是复制的概念只是一个基本概念。每当您编写一个链接列表并通过实际交换指向它们的指针来“交换元素”时,您就正在进行“移动”。基本上。

1
lvalue和rvalue的概念来自于C语言,尽管我认为他们只使用了术语lvalue,并将rvalue称为“不是lvalue”。 - bames53
值被移动并不意味着移动值的概念被理解了。人们认为交换是复制-复制-复制。 - Elazar
现在你代表“大多数人”说话 :) 人们可能知道他们想做什么,但是在将这个想法转化为代码时,他们可能会失去抽象的“移动”部分。我的意思是,在语言中命名这个概念很重要,即使该名称存在于语言之外。即使“移动”没有被编入语言中,名称也应该被引入。有点像概念。 - Elazar
@Elazar:嘿,调酒师!我要和他一样的。 - Lightness Races in Orbit
@LightnessRacesinOrbit 如果你要来一杯,我也要来一杯。 - Martin James
显示剩余5条评论

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接