gpt4 book ai didi

c - 尽管有无限的 ulimit,为什么非常大的堆栈分配会失败?

转载 作者:IT王子 更新时间:2023-10-29 00:20:54 25 4
gpt4 key购买 nike

下面的静态分配给出了段错误

double U[100][2048][2048];

但是下面的动态分配没问题

double ***U = (double ***)malloc(100 * sizeof(double **));

for(i=0;i<100;i++)
{
U[i] = (double **)malloc(2048 * sizeof(double *));
for(j=0;j<2048;j++)
{
U[i][j] = (double *)malloc(2048*sizeof(double));
}
}

ulimit 在 linux 中设置为无限制。

有人能给我一些提示吗?

最佳答案

当您说 ulimit 设置为无限制时,您使用的是 -s 选项吗?否则这不会更改堆栈限制,只会更改文件大小限制。

尽管如此,似乎还是有堆栈限制。我可以分配:

double *u = malloc(200*2048*2048*(sizeof(double)));  // 6gb contiguous memory

然后运行我得到的二进制文件:

VmData:  6553660 kB

但是,如果我在栈上分配,它是:

double u[200][2048][2048];

VmStk: 2359308 kB

这显然是不正确的(暗示溢出)。使用原始分配,两者给出相同的结果:

Array:  VmStk:   3276820 kB
malloc: VmData: 3276860 kB

但是,运行堆栈版本时,无论数组的大小如何,我都无法生成段错误——即使它大于系统上实际的总内存,如果 -s unlimited 是设置。

编辑:

我在一个循环中用 malloc 做了一个测试,直到它失败:

VmData: 137435723384 kB  // my system doesn't quite have 131068gb RAM

但是,堆栈使用量永远不会超过 4gb。

关于c - 尽管有无限的 ulimit,为什么非常大的堆栈分配会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15448438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com