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

时间:2019-06-05 16:11:47

标签: rust

clone_from的文档中说:

  

从源执行复制分配。

     

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

为什么clone_from(副本分配)避免不必要的分配?什么是例子?

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

1 个答案:

答案 0 :(得分:5)

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

以下是每种情况的发生情况:

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