Rust-调试模式与发布模式的堆栈大小不同吗?

Rust-调试模式与发布模式的堆栈大小不同吗?,rust,stack-size,Rust,Stack Size,考虑以下计划: fn recursive_call(x: u32) -> u32 { println!("x: {:?}", x); recursive_call(x +1) } fn main() { recursive_call(0); } 当我运行cargo build&&&./target/debug/recursive_call时,这会在x:58152之后崩溃: x: 58152 thread 'main' has overflo

考虑以下计划:

fn recursive_call(x: u32) -> u32 {
    println!("x: {:?}", x);
    recursive_call(x +1)
}

fn main() {
    recursive_call(0);
}
当我运行
cargo build&&&./target/debug/recursive_call
时,这会在
x:58152
之后崩溃:

x: 58152

thread 'main' has overflowed its stack
fatal runtime error: stack overflow
Aborted (core dumped)
当我运行
cargo build--release&&./target/release/recursive_call
时,只有在
x:104728
之后才会崩溃:

x: 104728

thread 'main' has overflowed its stack
[...]

我想知道这种行为上的差异是从哪里来的?在版本模式和调试模式下,堆栈大小是否不同?或者这是因为我缺少一些编译时优化(如果是,优化是什么?

是的,在x86-64上,调试模式下函数的保留堆栈大小为120字节,启用优化(
-O
)时为72字节。这很正常。

对于调试和发布,堆栈大小是相同的(除非您有线程,否则堆栈大小实际上是由操作系统固定的,请参见Linux上的ulimit-s)。但是,堆栈的用法可能不同,因为在调试模式下,编译器会向每个堆栈帧添加一些数据,以帮助调试器查找局部变量

请注意,并允许在释放模式下进行无限循环