G.VAR.04 避免因局部变量过大而导致的大量栈分配

【级别】 建议

【描述】

Rust 局部变量默认分配在栈上。当局部变量占用栈空间过大时,会栈溢出。

采用Box<T>分配也可能出现栈溢出,参见issues #53827,因为目前 Box<T>的行为是先在栈上分配然后再复制到堆上。

Rust 默认栈分配空间为:

  1. 主线程默认 8MiB
  2. 运行中代码创建的子线程默认是 2MiB

也可以自行配置栈分配内存大小。

所以,局部变量占用多少空间才算过大,这个需要开发者根据具体的场景根据栈大小配置情况做出合适的预判,一般以 512 KiB为宜。

【反例】

fn main() {
    // 不符合:运行时会栈溢出
    let a = [-1; 3000000];
    // or 
    // 不符合:运行时会栈溢出
    let a = Box::new([-1; 3000000]);
}

【正例】


#![allow(unused)]
fn main() {
// 符合:栈大小适中
let _: [i32; 8000] = [1; 8000];
}