|
|
1
24
与C/C++相反,Rust在复制和移动的类型之间有非常明确的区别。请注意,这只是语义上的区别;在实施层面上采取行动 是 然而,作为一个浅字节复制,编译器对如何处理从中移动的变量设置了某些限制。 默认情况下 每一个 类型仅可移动(不可复制)。这意味着这些类型的值会四处移动:
你看,存储在
移动语义是Rust中所有权概念的重要组成部分。你可以阅读更多关于它的内容 in the official guide .
然而,有些类型足够简单,所以它们的字节复制也是它们的语义复制:如果一个字节一个字节地复制一个值,就会得到一个完全独立的新值。例如,原始数就是这样的类型。此类财产由
然而,它并不适用于所有类型。例如,像动态分配的向量这样的结构不能自动复制:如果是,则其中包含的分配地址也将被字节复制,然后此类向量的析构函数将在同一分配上运行两次,导致该指针被释放两次,这是一个内存错误。
因此,默认情况下,Rust中的自定义类型是不可复制的。但你可以使用
(派生)
如果您的类型原则上可以自动复制,也就是说,它没有关联的析构函数,并且它的所有成员都是可复制的
你可以用
以上是1和2的答案。至于第三点,是的,你完全正确。它确实可以工作,因为值被移动到函数中。如果你试图使用
|
|
|
2
5
这个简单的定义意味着只需要告诉编译器这些语义是正确的,因为运行时行为没有根本性的改变:都是移动(非移动)-
(如果
创建数组就是通过浅拷贝复制值,如果
将插入适当的空实现(
嗯,如果不调用函数,就看不到移动与复制行为(如果你在同一时间调用它两次)-
|
|
|
Phoenix · 重构工作区结构会导致外部板条箱导入无法工作 8 年前 |
|
|
tenpn · Cargo未在顶级文件中运行测试 9 年前 |
|
|
Paul C · 当库名称与包名称不同时,如何导入板条箱依赖项? 9 年前 |
|
|
Antimony · 如何用Cargo从项目目录外打包源代码? 10 年前 |
|
|
joeforker · Cargo命令打印目标文件列表? 10 年前 |
|
|
solidsnack · 向Cargo构建添加代码生成标志 10 年前 |