gpt4 book ai didi

c - 使用堆栈来避免动态分配是一种不好的方式吗?

转载 作者:太空宇宙 更新时间:2023-11-04 00:50:30 25 4
gpt4 key购买 nike

我理解这个非常相似的问题给出的答案: When is it best to use the stack instead of the heap and vice versa?

但我想确认:

这是一个非常简单的程序:

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("%f\n",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("%f\n",p[i]);
free(p);
}

似乎两个版本都有效(?)。一种是使用栈,另一种是使用堆(?)。两种方法都有效吗?它们的优势或问题是什么?

如果确实从 test_alloc 退出后不再使用数组,那么第一种方法是否更可取,因为它不需要内存管理(即忘记释放内存)?

如果大量调用 test_alloc,在堆中预留内存是否更耗时,这是否会对性能产生影响?

是否有理由使用第二种方法?

最佳答案

栈(或)堆的分配问题取决于以下参数:

  • 您希望变量可用的范围和生命周期:如果您需要在test_alloc 之后使用double 数组的成员,请在您的程序中说明在 main ,你应该去动态分配。

  • 堆栈的大小:假设您正在使用 test_alloc在具有 4K 堆栈的线程的上下文中运行,而您的数组大小又取决于 size变量帐户到1K,那么堆栈分配是不可取的,你应该去动态分配。

  • 代码的复杂性:在使用动态分配时,请注意避免内存泄漏、悬空指针等。这会增加代码的复杂性,并且更容易出现错误.

  • 分配频率:调用mallocfree在一个循环中可能具有较低的性能。这一点是基于这样一个事实,即堆栈中的分配只是抵消SP的问题。 ,相反,堆中的分配需要更多的簿记。

关于c - 使用堆栈来避免动态分配是一种不好的方式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20563285/

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