我可以找到很多开发人员抱怨在堆栈上初始化的大数组会产生stack overflow
错误的例子
int main(int argc, const char * argv[])
{
int v[100000000];
memset(&v, 0, sizeof(v));
}
在Apple LLVM 7.0上进行编译时,这不会导致stack overflow
,这让我感到困惑,因为数组的大小约为400Mb,远远超过通常的堆栈大小。
为什么上述代码不会导致stack overflow
?
答案 0 :(得分:2)
由于您没有使用v
,因此编译器可能没有分配它,尝试类似
int v[100000000];
for (int i = 0 ; i < sizeof(v) / sizeof(*v) ; ++i)
v[i] = 0;
答案 1 :(得分:0)
您的数组超过100 Mb(*),但假设它是100 Mb,这意味着您的堆栈大小大于100 Mb,或者您的编译器忽略它,因为您不使用它。这是编译器优化。
(*)确实1M = 1024 * 1024,而不是1000 * 1000.一个int超过1位,也超过1个字节。最后,Mb表示Megabit,MB表示Megabyte。