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