【发布时间】:2018-01-07 21:26:32
【问题描述】:
我是否忘记了借用和移动的工作原理?
let mut v = vec![1, 2, 3]; // I have some uncopyable value
if false {
let t = v; // I might do something that consumes it
}
println!("{:?}", v); // in some condition, I know for sure that I didn't consume it
我能以某种方式使用unsafe 子句告诉编译器信任我吗?
任何解决方案都必须没有运行时开销。
【问题讨论】:
-
把它塞进一个选项?
-
@CodesInChaos 这仍然需要运行时开销。如果我用 C++ 编程,我就不必为了灵活性而牺牲性能。 Rust 声称它从不牺牲 c++ 的性能,我可以包装不安全的代码来处理这些场景。
-
即使在 C++ 中这也很棘手,因为您需要确保在变量超出范围时析构函数不会运行。
-
我现在意识到,在 c++ 中,当对向量进行移动时,它会经历与 rust 中将其设置为等于空向量相同的无效化。
-
@Evan 这是导致 Rust 可能比 C++快 的一件事。由于 Rust 没有必须 填充零值,因此它在概念上可以执行更少的操作。正如@CodesInChaos 所示,您可以通过将值替换为空的
Vec来选择该路径。
标签: rust