禁用堆分配的Rust编译器标志是什么?

时间:2018-08-20 15:31:56

标签: rust

我正在阅读an article,其中说Rust有一个编译器选项来禁用堆分配:

  

Rust具有许多依赖堆的标准库功能,   像盒子。但是,Rust的编译器指令可以完全   禁用所有使用堆的语言功能,并静态验证   这些功能均未使用。完全可行   编写没有堆使用情况的Rust程序。

在编译时检查任何错误堆分配的能力对我来说非常有价值。确切地说,您如何在Rust中做到这一点?我在rustc man page中看不到任何相关的标志。

1 个答案:

答案 0 :(得分:6)

没有这样的编译器标志,尽管我认为这不是本文的意思:

  

Rust具有编译器指令

我会将“指令”解析为属性,例如#[foo]。我仍然不知道可以实现此目标的属性。

请注意,您的文章早于Rust 1.0:

  

Rust,版本0.11


您能获得的最接近的结果是避免使用标准库,而仅使用the core library。这样可以避免使用liballoc(分配的主要机制)。这样做可以防止甚至存在BoxString之类的类型,这是非常强大的静态保证。

#![no_std]

pub fn example() {
    Box::new(42);
}
error[E0433]: failed to resolve. Use of undeclared type or module `Box`
 --> src/lib.rs:4:5
  |
4 |     Box::new(42);
  |     ^^^ Use of undeclared type or module `Box`

但是,没有什么可以阻止您重写liballoc中相同的代码并自己分配内存。您也可以链接到分配内存的现有库。没有魔术编译器可以检测堆分配。

另请参阅: