代码之家  ›  专栏  ›  技术社区  ›  SMeznaric

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

  •  1
  • SMeznaric  · 技术社区  · 4 年前
    #include <iostream>
     
    int main()
    {
        constexpr size_t array_size{1000000000};
        int stack[array_size];
        std::cout << sizeof(stack);
        return 0;
    }
    

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

    #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;
    }
    

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

    这似乎是触发溢出所必需的:

    #include <iostream>
     
    int main()
    {
        constexpr size_t array_size{1000000000};
        int stack[array_size];
        stack[0] = 0;
        for(size_t i{1}; i<array_size; i++)
            stack[i] = stack[i-1] + 1;
    
        std::cout << sizeof(stack) << "\n";
        std::cout << "Last element: " << stack[array_size - 1] << "\n";
        return 0;
    }
    
    1 回复  |  直到 4 年前
        1
  •  4
  •   Ted Lyngmo    4 年前

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

    unoptimized (撞车)与 optimized 4000000000 )结果。