Rust 复制特性是关于仅从堆栈复制位的吗?

Rust 复制特性是关于仅从堆栈复制位的吗?,rust,Rust,Rust将Copy标记的类型定义为 仅通过复制位即可复制其值的类型 我想知道这个定义是指仅从堆栈复制变量值,还是包括复制堆资源?换句话说,Copy只是编译器的一个标志,上面有这样一个通知:“如果您要创建另一个具有相同值的这种类型的变量,只需从堆栈中复制与第一个变量相关的所有内容。这就足够了。” 如果我有一个类型,它的对象在堆中分配一个资源,并且我确信在通过memcpy或其他方式对该资源进行位复制的情况下不会出现可怕的事情,那该怎么办。我不能用Copy来表示类型吗(由于生锈,只能堆叠复制) 我想知

Rust将
Copy
标记的类型定义为

仅通过复制位即可复制其值的类型

我想知道这个定义是指仅从堆栈复制变量值,还是包括复制堆资源?换句话说,
Copy
只是编译器的一个标志,上面有这样一个通知:“如果您要创建另一个具有相同值的这种类型的变量,只需从堆栈中复制与第一个变量相关的所有内容。这就足够了。”

如果我有一个类型,它的对象在堆中分配一个资源,并且我确信在通过
memcpy
或其他方式对该资源进行位复制的情况下不会出现可怕的事情,那该怎么办。我不能用
Copy
来表示类型吗(由于生锈,只能堆叠复制)

我想知道这个定义是指仅从堆栈复制变量值,还是包括复制堆资源

是前者。它指的是通过对数据执行简单的、浅层的逐字节复制来复制值

更准确地说,
Copy
意味着“按位复制值并继续使用原始值是安全的”。原则上,所有Rust对象都是按位复制的,无论是通过赋值还是传递给函数等。当对象不是
Copy
时,不同之处在于对象被称为已移动,编译器不允许您访问作为复制源的对象。(如果编译器实现了
drop
,它也不会删除原始对象,因为它将被新所有者删除。)

换句话说,Copy只是编译器的一个标志,上面有这样一个通知:“如果您要创建另一个具有相同值的这种类型的变量,只需从堆栈中复制与第一个变量有关的所有内容。这就足够了。”

如果我有一个类型,其对象在堆中分配一个资源,并且我确信在通过memcpy或其他方式对该资源进行位复制的情况下不会出现可怕的事情,那该怎么办。我还不能用Copy来表示类型吗(因为生锈,所以只能进行堆栈复制)

没有办法(而且很可能永远也不会有办法)将此类类型表示为
Copy
。如果要允许复制此类对象,则必须使其
Clone
,并要求用户显式键入
.Clone()
。这就是锈迹“使分配明确化”的说法的含义之一


请注意,所有这些都不需要在堆栈上分配副本的源或目标。它们也可以,同样的原则也同样适用。“堆栈”是不相关的:重要的是逐字节的值传输是否被视为“复制”或“移动”,这将取决于类型是
copy

而不是stack vs heap,而
是一种对象分配资源的类型
最大的问题是如何进行释放。如果一个类型是Copy,那么你不知道有多少个副本,如果它们引用了分配的数据,你就无法知道何时取消分配。@loganfsmyth如果通过按位复制分配资源的多个对象不安全,这是否意味着在
复制
Rust的情况下只复制变量信息(尽管如此,它还是存储在堆栈中,不是吗?)拒绝做更多的事情吗?堆栈在这里是一个麻烦事。您可以有两个具有属性
foo
的堆分配对象,并写入
obj1.foo=obj2.foo
。这将执行从堆到堆的逐位复制。如果
foo
字段的类型是
copy
,它将保持
obj2
可用。如果
>foo
不是
Copy
,它将离开
obj2