c++ - 为什么这不会在 WSL 中的 Ubuntu 上触发堆栈溢出?

标签 c++ ubuntu stack stack-overflow

#include <iostream>
 
int main()
{
    constexpr size_t array_size{1000000000};
    int stack[array_size];
    std::cout << sizeof(stack);
    return 0;
}
该程序只打印出 4000000000。所以看起来这应该需要将近 4GB 的内存,远远超过我认为 Ubuntu 的堆栈大小的 8MB。我在 WSL 中运行它以防万一。
一个想法是它可能会被优化。所以我像这样更新了程序:
#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;
}

最佳答案

该程序(很可能)经过优化,只显示大小,实际上没有分配内存。根据 as-if 允许这样做。规则。
以下是您可以比较 unoptimized 的示例(崩溃)与 optimized (打印 4000000000 )结果。

关于c++ - 为什么这不会在 WSL 中的 Ubuntu 上触发堆栈溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65845103/

相关文章:

c++ - 如何使用 BOOST_THROW_EXCEPTION?

c++ - 在 C++ 中在一行的末尾写一个或多个分号会改变什么吗

c - Ubuntu libdispatch 包含什么

ubuntu - 处理输入时发现 ubuntu 上的 ffmpeg/avconv 无效数据

java - 如何监控java应用程序的堆栈使用情况

c++ - 在具有已删除复制构造函数的类的元素的数组初始化中需要但未使用的 move 构造函数

android - Android Studio Canary 3.0 中的 NDK 问题

ubuntu - 如何在 ubuntu 中提取 .tar 文件?

linux - gdb:检查堆栈和小端澄清

c - 在C中用栈实现链表