为什么这不会触发 WSL 内 Ubuntu 上的堆栈溢出?
Why doesn't this trigger a stack overflow on Ubuntu inside WSL?
#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 (crashes) with the optimized(打印 4000000000
)结果的示例。
#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 (crashes) with the optimized(打印 4000000000
)结果的示例。