You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows下Rust使用once_cell::Lazy触发栈溢出问题咨询

once_cell 大数组跨平台栈溢出问题

问题复现代码

use once_cell::sync::Lazy;

fn main() {
    const TEST: Lazy<[[u64; 64]; 512]> = Lazy::new(|| unimplemented!());

    TEST[0];
}

不同平台运行表现

  • Windows环境:程序直接崩溃退出,报栈溢出错误,输出内容如下:
thread 'main' has overflowed its stack
error: process didn't exit successfully: `target\debug\chess_ai.exe` (exit code: 0xc00000fd, STATUS_STACK_OVERFLOW)
  • Linux(WSL Debian GNU/Linux 9)环境:运行表现符合预期,正常触发unimplemented!()的panic,输出内容如下:
Finished dev [unoptimized + debuginfo] target(s) in 23.38s
     Running `target/debug/chess_ai`
thread 'main' panicked at 'not implemented', src/main.rs:4:56
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
  • Rust Playground 同版本代码运行表现和Linux环境一致,无栈溢出问题。

环境信息

  • once_cell 版本:1.12.0
  • Windows、Linux本地环境rustc版本:均为1.61.0

问题成因

核心问题是错误地将Lazy实例声明为const而非static:

  • Rust中const是编译期内联常量,代码里每一处引用该常量的位置,都会在当前栈帧直接拷贝一份完整的常量值
  • 示例中定义的[[u64; 64]; 512]数组总大小为256KB,Windows默认主线程栈空间仅1MB,debug模式下函数调用、临时变量的额外栈开销加上这256KB的数组副本,直接触发栈溢出
  • Linux默认主线程栈空间为8MB,256KB的临时副本不会超出栈上限,因此能正常执行到初始化逻辑,触发unimplemented!()的panic
  • Rust Playground运行环境为Linux,因此表现和本地Linux环境一致

once_cell::sync::Lazy的设计目标是配合static静态变量使用,实现全局值一次性初始化,将其声明为const属于错误用法,完全违背了Lazy的设计初衷。

解决方案

将声明TEST的const关键字替换为static即可,修改后代码如下:

use once_cell::sync::Lazy;

fn main() {
    static TEST: Lazy<[[u64; 64]; 512]> = Lazy::new(|| unimplemented!());

    TEST[0];
}

修改后Windows平台运行表现会和Linux完全一致,正常触发unimplemented!()的panic,不会再出现栈溢出问题。

内容的提问来源于stack exchange,提问作者Elias

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 04:18:30