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)。但是,堆栈的用法可能不同,因为在调试模式下,编译器会向每个堆栈帧添加一些数据,以帮助调试器查找局部变量
请注意,并允许在释放模式下进行无限循环