|
|
1
25
我相信D中有几个地方(如返回结构),D可以使它们移动,而C++会使它们成为副本。IIrc,编译器在任何情况下都可以执行一个移动,而不是一个副本,因为它可以确定不需要拷贝,所以结构复制在D中要比C++中要少。当然,由于类是引用,它们根本没有问题。
但是不管怎样,复制构造在D中的工作方式不同于C++。一般来说,不是声明复制构造函数,而是声明postblit构造函数:
容器通常是引用类型(在PHOBOS中,它们是结构而不是类,因为它们不需要多态性,但是复制它们不复制它们的内容,所以它们仍然是引用类型),所以复制它们并不昂贵,就像在C++中一样。 在D中,可以使用类似于移动构造函数的一些情况,但是一般来说,D是这样设计的,以减少C++在复制对象时所遇到的问题,因此它不存在C++中的问题。 |
|
|
2
1
D具有单独的值和对象语义:
现在,假设您不自己管理内存,因为这是D中的默认情况-使用垃圾收集器-您必须理解声明为
所以,当在D中传递向量时,传递的是引用/指针。自动。不涉及副本(参考文件副本除外)。 这就是为什么D、C、Java和其他语言不需要移动语义(因为大多数类型是对象语义的,是通过引用而不是通过复制来操作的)。 也许他们能实现,我不确定。但是他们真的能像C++一样获得性能提升吗?从本质上看,这似乎不太可能。 |
|
|
3
1
我有某种感觉,实际上,RoValk引用和“移动语义”的整个概念是C++中创建本地的“临时”堆栈对象的结果。 在D语言和大多数GC语言中,堆中有对象是最常见的,当通过调用堆栈返回临时对象时,多次复制(或移动)临时对象不会产生开销 -所以也不需要一个机制来避免这种开销。
在D(和大多数GC语言)中
奥托,
这将得出结论-D没有rvalue ref,因为它不需要它们 . 但是,我在实践中没有使用rvalue引用,我只阅读过它们,所以我可能跳过了这个特性的一些实际用例。请把这篇文章看作是对这件事的一堆想法,希望对你有帮助,而不是一个可靠的判断。 |
|
|
4
1
我认为所有的答案都没有回答原来的问题。 首先,如上所述,这个问题只与结构相关。类没有有意义的移动。如上所述,对于结构,编译器在某些条件下会自动执行一定量的移动。
如果你想控制移动操作,这里是你必须做的。您可以用@disable注释这个(this)来禁用复制。接下来,可以重写C++的
因为你还需要摧毁
编辑:
注意我没有定义
|
|
|
5
0
我想如果你需要资源来释放资源,你可能会有麻烦。然而,作为GC'ed,您通常可以避免担心多个所有者,因此在大多数情况下这可能不是问题。 |
|
|
apetrai · 我应该如何假设算法使用哪种迭代器类别? 3 年前 |
|
|
ridiculous_fish · std::是否保证短路? 3 年前 |
|
|
Fabio · 在c中将指针赋给常数指针++ 3 年前 |
|
|
johnco3 · 初始化固定C数组成员结构 7 年前 |
|
|
mans · 为什么出现此错误:constexpr在此处无效 7 年前 |
|
juztcode · 在C++中尝试捕获-创建了多少个对象 7 年前 |
|
|
Steven Scott · 忽略元素的基于范围的for循环 7 年前 |