为什么这不会在 WSL 内的 Ubuntu 上触发堆栈溢出?

问题描述

times

程序只打印出 4000000000。所以看起来这应该需要近 4GB 的内存,明显超过我认为是 Ubuntu 堆栈大小的 8MB。以防万一,我会在 WSL 内部运行它。

一个想法是它可能会被优化。所以我更新了这个程序:

#include <iostream>
 
int main()
{
    constexpr size_t array_size{1000000000};
    int stack[array_size];
    std::cout << sizeof(stack);
    return 0;
}

运行时间稍长,然后输出 4000000000。

看来这是触发溢出所必需的:

#include <iostream>
 
int main()
{
    constexpr size_t array_size{1000000000};
    int stack[array_size];
    for(size_t i{0}; i<array_size; i++)
        stack[i] = i;

    std::cout << sizeof(stack);
    return 0;
}

解决方法

该程序(最有可能)经过优化,仅显示大小,实际上没有分配内存。根据 as-if 规则,这是允许的。

以下是您可以比较 unoptimized(崩溃)和 optimized(打印 4000000000)结果的示例。