在Rust中,复制和克隆的区别是什么?

jdzmm42g  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(135)

我试图弄清楚X1 M0 N1 X和Rust中的X1 M1 N1 X之间的区别。在谷歌上搜索我看到的答案似乎可以归结为:Clone是为任意复制而设计的,而Copy表示可以通过memcpy安全复制的值。
所有这些答案的问题是所有对memcpy的引用都假设读者知道memcpy是什么
但是对于像我这样不确定memcpy的人来说,因为我没有C/C++的经验,不知道这如何帮助解释复制和克隆之间的区别。
有人能帮助解释一下什么是memcpy,以及具体地说,提到它是如何区分拷贝和克隆的吗?

guicsvcw

guicsvcw1#

memcpy是复制字节缓冲区的低级系统函数。在伪代码中,memcpy执行以下操作:

memcpy(to, from, size):
  for i from 0 to size:
    to[i] = from[i]

也就是说,它实际上是一个简单的,按元素的方式将字节从一个内存位置复制到另一个固定长度的内存位置。但它的实现非常高效。如果一个类型是memcpy-able,这意味着它的内存表示不包含依赖于它的内存位置的逻辑。也就是说,一个对象一旦被复制或移动到不同的内存地址,它仍然有效。
这对于i32f64等类型是正确的。但对于向量就不正确了,因为向量通常是以大小、容量和指向另一个缓冲区的指针的形式实现的。如果我们通过memcpy复制一个向量,那么新对象中的这个指针现在仍然指向旧对象的缓冲区。这就是i32等实现Copy的原因。但是std::vec::Vec不具有。

相关问题