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++中.