使用堆栈来避免动态分配是不好的方式吗?
我明白这个非常类似的问题给出的答案:什么时候最好使用栈而不是堆,反之亦然?
但我想确认一下:
这是一个非常简单的程序:
void update_p(double * p, int size){
//do something to the values refered to by p
}
void test_alloc(int size){
double p[size];
unsigned int i;
for(i=0;i<size;i++)p[i]=(double)i;
update(&p,size);
for(i=0;i<size;i++)printf("%fn",p[i]);
}
int main(){
test_alloc(5);
return 1;
}
和另一个版本的test_alloc:
void test_alloc(int size){
double * p = calloc(sizeof(double),size);
unsigned int i;
for(i=0;i<size;i++)p[i]=(double)i;
update(p,size);
for(i=0;i<size;i++)printf("%fn",p[i]);
free(p);
}
这似乎是两个版本都有效(?)。 一个使用堆栈,另一个使用堆(?)。 两种方法都有效吗? 他们的优点或问题是什么?
如果确实数组一旦从test_alloc退出就不会被使用,那么第一种方法更适合不需要内存管理(即忘记释放内存)?
如果test_alloc被大量调用,在堆中预留内存会耗费更多时间,并且这可能会影响性能?
会有什么理由使用第二种方法吗?
堆栈(或堆)中的分配问题取决于以下参数:
您希望变量可用的范围和生存期:在您的程序中,如果您需要在main
test_alloc
之后使用double数组的成员,则应该进行动态分配。
你的堆栈的大小:假设你正在一个线程的上下文中使用test_alloc
函数,这个线程有一个4K堆栈,而你的数组大小依次依赖于size
可变的账户到1K ,那么堆栈分配是不可取的,你应该去动态分配。
代码的复杂性:使用动态分配时,请注意避免内存泄漏,悬挂指针等。这会增加代码的复杂性,并且更容易出现错误。
分配的频率:在循环中调用malloc
和free
可能会有较低的性能。 这一点是基于这样一个事实,即堆栈中的分配仅仅是取消SP
,相反,当堆中的分配需要更多的记录时。
在堆栈版本中,您不能分配具有100000000个元素的数组。 当使用堆栈分配小数组时,速度更快。 当分配非常大的数组时,使用堆。
有关堆栈,堆内存分配的更多信息,请考虑这些写法:基于堆栈的内存分配,基于堆的内存分配
“如果test_alloc被大量调用,在堆中预留内存会耗费更多时间,并且这可能会影响性能?”
那么我想你正在从堆栈和堆中分配性能。 总是堆栈分配速度更快,因为它只是移动堆栈指针。 堆分配肯定需要更多时间,因为它必须执行内存管理。 所以如果你在上述函数中没有太多的操作不会导致堆栈溢出(因为在堆栈上创建太多的对象会增加堆栈溢出的机会),并且你不需要这个变量的作用域就可以可能使用堆栈本身。
所以要回答你的问题,如果你不在堆栈上使用太多的对象并导致堆栈溢出,那么使用堆栈来避免动态分配并不坏。
希望这可以帮助。
链接地址: http://www.djcxy.com/p/79843.html上一篇: Is it a bad manner to use the stack to avoid dynamic allocation?