D有类似于C++ 0x的移动语义吗?

fre*_*low 28 c++ d rvalue-reference move-semantics c++11

外部资源(如std::vector<T>std::string)的"值类型"问题是复制它们往往非常昂贵,并且副本是在各种上下文中隐式创建的,因此这往往是性能问题.C++ 0x对这个问题的回答是移动语义,它在概念上基于资源窃取的思想,并且由rvalue引用技术驱动.

D是否有类似于移动语义或右值引用的东西?

Jon*_*vis 25

我相信在D中有几个地方(比如返回结构),D设法使它们移动,而C++会使它们成为副本.IIRC,编译器在任何可以确定不需要副本的情况下都会执行移动而不是副本,因此结构复制在D中的发生比在C++中少.当然,由于类是引用,它们根本没有问题.

但无论如何,复制结构在D中的工作方式与C++相比有所不同.通常,您不是声明复制构造函数,而是声明一个postblit构造函数:this(this).它在this(this)调用之前执行完整的memcpy ,并且您只进行必要的更改以确保新结构与原始结构分离(例如在需要时执行成员变量的深层复制),而不是创建全新的构造函数必须复制一切.因此,一般方法已经与C++略有不同.它也普遍认为结构不应该有昂贵的postblit构造函数 - 复制结构应该是便宜的 - 所以它不像C++那样是一个问题.复制成本昂贵的对象通常是具有引用或COW语义的类或结构.

容器通常是引用类型(在Phobos中,它们是结构而不是类,因为它们不需要多态,但复制它们不会复制它们的内容,因此它们仍然是引用类型),因此复制它们并不昂贵就像在C++中一样.

在D中可能会出现类似于移动构造函数的情况,但总的来说,D的设计方式可以减少C++在复制对象时遇到的问题,所以它远不是问题所在.它是在C++中.

  • @Kos我不知道D1做了什么,没有做什么.我只使用D2并且通常假设D上的问题与D2有关,除非另有说明 - 特别是当问题似乎来自不是D用户的人并且甚至可能不知道有版本1和版本时2的语言.我只是将术语D视为该语言的当前版本. (6认同)
  • 随着Andrei Alexandrescu的*D编程语言*的发布,D2作为一种语言变得基本稳定 - 可能会做出微小的改变 - 但没什么大不了的.编译器仍然需要工作(尽管许多错误也适用于D1),并且标准库正在大量开发中,但语言规范不再处于繁重的开发阶段.这个问题涵盖了几个月前的情况,情况基本相同:http://stackoverflow.com/questions/3205509/what-are-the-current-challenges-of-the-d-programming -语言 (3认同)