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

我明白这个非常类似的问题给出的答案:什么时候最好使用栈而不是堆,反之亦然?

但我想确认一下:

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

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 ,那么堆栈分配是不可取的,你应该去动态分配。

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

  • 分配的频率:在循环中调用mallocfree可能会有较低的性能。 这一点是基于这样一个事实,即堆栈中的分配仅仅是取消SP ,相反,当堆中的分配需要更多的记录时。


  • 在堆栈版本中,您不能分配具有100000000个元素的数组。 当使用堆栈分配小数组时,速度更快。 当分配非常大的数组时,使用堆。

    有关堆栈,堆内存分配的更多信息,请考虑这些写法:基于堆栈的内存分配,基于堆的内存分配


    “如果test_alloc被大量调用,在堆中预留内存会耗费更多时间,并且这可能会影响性能?”

    那么我想你正在从堆栈和堆中分配性能。 总是堆栈分配速度更快,因为它只是移动堆栈指针。 堆分配肯定需要更多时间,因为它必须执行内存管理。 所以如果你在上述函数中没有太多的操作不会导致堆栈溢出(因为在堆栈上创建太多的对象会增加堆栈溢出的机会),并且你不需要这个变量的作用域就可以可能使用堆栈本身。

    所以要回答你的问题,如果你不在堆栈上使用太多的对象并导致堆栈溢出,那么使用堆栈来避免动态分配并不坏。

    希望这可以帮助。

    链接地址: http://www.djcxy.com/p/79843.html

    上一篇: Is it a bad manner to use the stack to avoid dynamic allocation?

    下一篇: Why would you ever want to have an array on the heap?