【问题标题】:What is the origin of move semantics in C++?C ++中移动语义的起源是什么?
【发布时间】:2012-02-14 20:37:26
【问题描述】:

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

【问题讨论】:

  • 也许 C++11 中移动语义最令人信服的原因之一是 C++03 中缺乏移动语义,这清楚地体现在 auto_ptr 的黑客实现中。很明显,有人想做,但由于缺乏语言支持而无法干净利落地完成。
  • 移动语义自从人们开始编程就已经存在,但它都是手动的。移动语义作为一种语言特性的引入是关于如何将“可移动性”的概念编码到类型系统中,以便编译器可以决定何时“移动”事物,以及用户定义的类型如何声明对他们意味着什么被移动。 C++ 中的移动语义是 C++ 强调在类型系统中编码信息的产物。我不知道早期的语言与 C++ 一样强调类型系统。
  • @bames53:这可能是一个很好的答案。
  • @LightnessRacesinOrbit 我只是对自己对历史语言的了解不够自信。您在回答中链接的提案不承认以前的语言这一事实​​似乎是很好的证据,所以我投票支持您的回答:)
  • C++ 狂热者对他们钟爱的语言不断受到攻击感到恼火。超值复制,因此他们发明了语义来避免某些复制并将其称为“移动”。 :)

标签: c++ history move-semantics


【解决方案1】:

这个概念似乎没有任何特定的祖先。如the original proposal 所述,C++ 移动语义的起源是新闻组中的讨论:

各种形式的移动语义已在 C++ 论坛(大多数 特别是 comp.lang.c++.moderated) 多年。

在我看来,它们与 C++ 的左值和右值概念紧密结合,如果我没记错的话,这纯粹是一个 C++ 概念。没有左值、右值及其新的 C++11 朋友的语言不需要 C++ 实现它们的方式中的移动语义。

不过,更一般地说,移动内容而不是复制的概念只是一个基本概念。每当您编写一个链表并通过实际上只是交换指向它们的指针来“交换元素”时,您就是在进行“移动”。基本上。

【讨论】:

  • lvalue 和 rvalue 的概念来自 C,虽然我认为他们只使用了术语 lvalue 并将 rvalues 称为“not an lvalue”。
  • 值被移动的事实并不意味着移动值的概念被理解。人们确实认为交换是复制-复制-复制。
  • @Elazar:为自己说话。我可以向你保证,大多数人几十年来一直认为这是正确的!
  • 现在你是代表“大多数人”的人 :) 人们可能知道他们想做什么,但是在将这种想法转化为代码时,他们可能会失去抽象的“移动”部分。我的意思是,命名这个概念(用语言)很重要,即使这个名字存在于语言之外。即使 move 没有融入语言,也应该引入这个名字。有点像概念。
  • @Elazar:有足够的证据表明移动而不是复制数据的概念是完全司空见惯的。看看所有使用memmovemate 的项目!
【解决方案2】:

您可以阅读"A Proposal to Add Move Semantics Support to the C++ Language" 以获取有关该概念背后的动机的更多信息,以及为什么需要直接的语言支持而不是使用库设施来实现。

【讨论】:

    猜你喜欢
    • 2021-08-29
    相关资源
    最近更新 更多