首页 > 解决方案 > C++ 在内存安全方面与 Rust 有多接近?

问题描述

有人对我说,我们可以使用现代特性在 C++ 中实现 Rust 的内存安全。

我知道如果人们不使用原始指针并使用,例如,在类似的情况下std::vector<T>替换,那么我们将拥有指针的数组绑定安全性,就像 Rust 中的切片一样。T*T = uint8_t

我们也可以使用智能指针,比如std::shared_ptr<std::vector<T>>在不复制的情况下传递该向量,并让 RAAI 防止内存泄漏。尽管如此,向量还是为我们提供了对数据的原始访问,但让我们假设有人对此很小心,并且只通过operator[].

防止内存泄漏和无效内存地址是 Rust 的主要功能。我不知道它还有什么其他特性,所以我想问一下它在安全性方面与精心编写的 C++ 代码相比如何。

另外,我认为存在开销,operator[]因为绑定验证将在 C++ 代码中进行,而 Rust 在低级别进行相同的验证。因此,如果我们要编写一个内核,我想依赖 C++ 的开销operator[]将是一个问题。但是,C++ 也可以具有内联汇编代码。那么,为了获得与 Rust 相同的性能,难道不能将这种开销插入到汇编中吗?

此外,Rust 的边界检查与没有边界检查的 C 原始指针访问相比是否存在明显的开销?

标签: c++memorymemory-managementmemory-leaksrust

解决方案


回答您的主要问题“在内存安全方面,C++ 与 Rust 有多接近?”

但是让我们假设有人对此很小心

有事情。对于 Rust 源代码,编译器会非常小心。

您缺少的另一件事是在线程之间共享数据。再次,rustc 将帮助您(以及您所有的实习生和初级)避免很多可能的问题。

在 C++ 中编写无错误代码仍然可以足够小心。但是你必须为那些可能被编译器在 Rust 中检查的东西浪费大量的脑力。当然,它可能会在新版本的 C++ 中发生变化。


推荐阅读