Constant ore::stack::STACK_RED_ZONE[][src]

pub const STACK_RED_ZONE: usize = {
    #[cfg(debug_assertions)]
    {
        256 << 10 // 256KiB
    }
    #[cfg(not(debug_assertions))]
    {
        32 << 10 // 32KiB
    }
}; // 0x0000_0000_0004_0000usize
This is supported on crate feature stack only.
Expand description

The red zone is the amount of stack space that must be available on the current stack in order for maybe_grow to call the supplied closure without allocating a new stack.

We use a much larger red zone in debug builds because several functions have been observed to have 32KB+ stack frames when compiled without optimizations. In particular, match statements on large enums are problematic, because each arm of the match statement gets its own dedicated stack space. For example, consider the following function:

fn big_stack(input: SomeEnum) {
    match input {
        SomeEnum::Variant1 => {
            let a_local = SomeBigType::new();
        }
        SomeEnum::Variant2 => {
            let b_local = SomeBigType::new();
        }
        // ...
        SomeEnum::Variant10 => {
            let z_local = SomeBigType::new();
        }
    }
}

In debug builds, the compiler will generate a stack frame that contains space for 10 separate copies of SomeBigType. This can quickly result in massive stack frames for perfectly reasonable code.