【发布时间】:2014-01-17 22:49:14
【问题描述】:
这来自 Bjarne Stroustrup 的 C++ 编程语言,第四版 3.3.2。
我们真的不想要副本;我们只是想得到结果 一个函数:我们想要移动一个 Vector 而不是复制它。 幸运的是,我们可以说明这个意图:
class Vector { // ... Vector(const Vector& a); // copy constructor Vector& operator=(const Vector& a); // copy assignment Vector(Vector&& a); // move constructor Vector& operator=(Vector&& a); // move assignment };根据该定义,编译器将选择移动构造函数 实现函数返回值的传递。 这意味着 r=x+y+z 将不涉及向量的复制。反而, Vectors 只是被移动了。通常,Vector 的移动构造函数是 简单的定义...
我知道 Golang 支持传统的值传递和使用 Go 样式指针的引用传递。
Go 是否像上面 Stroustrup 所描述的那样支持 C++11 的“移动语义”,以避免无用的来回复制?如果是这样,这是自动的,还是需要我们在代码中做一些事情才能实现。
注意:已经发布了一些答案 - 我必须稍微消化一下,所以我还没有接受 - 谢谢。
【问题讨论】:
-
@wheaties - 为什么不呢?你认为继续来回复制东西更好吗?为什么会这样?
-
移动语义为无复杂性的语言引入了更多复杂性。我宁愿保持简单,愚蠢,也不愿看着 Go 长成八角龟。
-
@wheaties - 比看着 Go 成长为一个八角的 turduckelephanizard 没有争论 - C++ 11 得到了改进,真的 - 缺点是现在有 100 种方法可以做一切,我们有200种方式!这就是我真正喜欢使用 Go 的原因。我真正想知道的是,如果这是自动处理的,以避免无用的来回复制。
-
Go 没有向量。它有自己的数组,并为您处理资源管理。因此,您只需要传递数组切片,而无需考虑如何实现任何内容。
-
@Vector,Go 的方式不是使用向量,而是使用切片。切片 value 是一个(打包的)结构,由一个指针和两个(平台大小的)整数组成——当你传递切片时,它会被复制,而且非常便宜。