作者:手机用户2502860131 | 来源:互联网 | 2023-09-05 19:47
Rust文档将Copy
标记类型定义为
可以简单地通过复制位来复制其值的类型
我想知道这个定义是否意味着仅从堆栈中复制变量值,还是也包括复制堆资源?换句话说,Copy
对于编译器来说,只是一个标志,带有类似“如果您要创建另一个具有相同值的这种类型的变量,只需从堆栈中复制与第一个变量相关的所有内容。这就足够了去做。”?
如果我有一个类型,其对象在堆中分配资源,并且我确信在通过memcpy
某种方式对该资源进行位复制的情况下不会出现可怕的事情,该怎么办。我仍然不能用Copy
(由于 Rust 只进行堆栈复制)来表示类型吗?
回答
我想知道这个定义是否意味着仅从堆栈中复制变量值,还是也包括复制堆资源?
是前者。它指的是通过对其数据执行朴素和浅层的逐字节复制来复制值。
更准确地说,Copy
意味着“按位复制值并继续使用原始值是安全的”。所有 Rust 对象原则上都是按位复制的,无论是通过赋值还是传递给函数等。 对象不在时的区别Copy
在于对象被称为移动,并且编译器不允许您访问该对象那是副本的来源。(如果它实现,编译器也不会删除原始对象,Drop
因为它将被新所有者删除。)
换句话说,Copy 只是编译器的一个标志,带有类似“如果您要创建另一个具有相同值的这种类型的变量,只需从堆栈中复制与第一个变量有关的所有变量。那就是足够了。”?
是的。
如果我有一个类型,其对象在堆中分配资源,并且我确信在通过 memcpy 或其他方式对该资源进行位复制的情况下不会出现可怕的事情。我仍然不能用 Copy 表示类型吗(由于 Rust 只进行堆栈复制)?
没有办法(并且可能永远不会有办法)将这样的类型表示为Copy
. 如果要允许复制此类对象,则必须创建它们Clone
并要求用户.clone()
明确键入。这就是声称 Rust“使分配明确”的意思之一。
请注意,这些都不需要在堆栈上分配副本的源或目标。它们也可以是堆分配对象的子字段,同样的原则同样适用。“堆栈”无关紧要:重要的是逐字节值传输是被视为“复制”还是“移动”,这取决于类型是否为Copy
.