在Linux上,使用C,假设我有一个动态确定的n
命名元素的数量,我必须在短时间内存储在一个数组(int my_array[n]
)中,一个函数调用,即被调用的函数只使用很少的内存(几百字节)。直到发生堆栈溢出为止的剩余堆栈大小
大部分n
很少,十分之一。但有时n
可能很大,多达1000或1000'000。
我该如何计算,我的堆栈是否可以容纳n*o + p
字节而没有溢出?
基本上:我的堆栈上剩下多少字节?
在Linux上,使用C,假设我有一个动态确定的n
命名元素的数量,我必须在短时间内存储在一个数组(int my_array[n]
)中,一个函数调用,即被调用的函数只使用很少的内存(几百字节)。直到发生堆栈溢出为止的剩余堆栈大小
大部分n
很少,十分之一。但有时n
可能很大,多达1000或1000'000。
我该如何计算,我的堆栈是否可以容纳n*o + p
字节而没有溢出?
基本上:我的堆栈上剩下多少字节?
事实上,checking available stack问题给出了很好的答案。
但更实际的答案是:不会在调用堆栈上分配大数据。
在你的情况,你可以处理不同的情况下n<100
(然后在堆栈上分配,也许是通alloca,是有道理的),当n>=100
(当时,在堆上分配与malloc
(或calloc
的情况下)和别忘了free
吧)。使阈值100
a #define
-d不变。
call stack上的典型调用帧应该在当前的笔记本电脑或台式机上最多为几千字节(如果有递归或线程,最好不要这么做)。总的堆栈空间通常最多为几兆字节(有时少得多:在内核内部,每个堆栈通常为4K字节!)。
混合'calloc'和'alloca'是个坏消息,因为初始化数据,而另一个不是。这可能会引入怪异的错误。 – Dave
好吧,它可能是'malloc'&'alloca'。 –
如果当进入主
man getrlimit
)当前堆栈指针和一个如果使用threa从步骤2记录在第1步中与限位之间
man pthread_getattr_np
可能的重复[在C中检查可用堆栈大小](http://stackoverflow.com/questions/53827/checking-available-stack-size-in -c) –
@BrendanLong,我看到了这个问题,但是因为它声明“我正在使用MinGW和GCC 3.4.5(mingw-special vista r3)”,所以答案有点以Windows为中心。我的问题是Linux/* nix居中。 ;-) – kay
为什么不能使用'getrusage()'和'getrlimit()'? – sverre