Clone :: clone_from如何避免不必要的分配?

Hel*_*ang 2 rust

的文档clone_from说:

从源执行复制分配。

a.clone_from(&b)a = b.clone()在功能上等效,但是可以重写以重用a的资源,以避免不必要的分配。

为什么clone_from(复制分配)避免不必要的分配?有什么例子?

我认为这是C ++中众所周知的概念,但是我没有强大的C ++背景。

mca*_*ton 5

让我们举个例子两个向量ab。每个向量都必须分配一个内部缓冲区来存储元素。

这是每种情况发生的情况:

  • a = b.clone()始终执行b.clone(),这将创建一个具有其自己缓冲区的全新向量,然后a = brand_new_vector扔掉a缓冲区并从中窃取brand_new_vector
  • a.clone_from(&b):如果a的缓冲区太小,它将分配足够大的缓冲区,但是如果a的缓冲区已经足够大,它将b直接将每个元素复制到a的缓冲区。在后一种情况下,a的缓冲区被回收,并且避免了内存分配。

  • 不,因为就编译器而言,“克隆”不是一个特殊的特征,因此编译器不知道“ a.clone_from(&b)”在语义上等效于“ a = b.clone()”。 (4认同)
  • 我实际上会说这并不等同。在`a = b.clone()`中,克隆`b`的元素,然后破坏`a`的元素。在“a.clone_from(&b)”中,“a”的元素被破坏,然后“b”的元素被克隆。如果破坏和克隆都有副作用,那么就可以观察到差异。 (3认同)