在堆栈上使用缓冲区而不是堆栈的性能优势(C)

时间:2018-10-08 14:17:46

标签: c performance stack heap

我有一个1024字节的小缓冲区,用于存储临时数据,然后将其写入更大的缓冲区。我正在重复使用这个小缓冲区几次。

在堆而不是堆栈上创建此缓冲区是否对性能有好处?

它是现有代码,因此是在堆上完成的,但是我不确定使用堆栈是否会更快,或者首先使用堆的原因到底是什么。

有什么想法吗?这是C代码。

2 个答案:

答案 0 :(得分:2)

如果您正在为非常小的系统编写代码,则可能需要使用malloc(或相关例程之一,例如calloc)来获取缓冲区,以免使用限制堆栈空间。

否则,在现代系统上,需要使用1024个字节的堆栈空间,并且在堆栈上创建缓冲区通常比使用malloc更快。 (正常的malloc调用至少需要一定数量的簿记工作,而堆栈分配则不需要。但是,如果例程仅使用malloc分配固定大小的缓冲区,使用它并释放它,编译器可能会始终将缓冲区优化为堆栈分配,在这种情况下,它们将是等效的。)

作为参考,在macOS上,Apple的工具默认为主堆栈的空间为8 MiB,每个线程的空间为2 MiB。

答案 1 :(得分:1)

通常,堆栈分配总是比堆分配快。

这是因为堆栈分配就像对堆栈指针的一次写入一样容易,而动态内存分配在分配期间包含许多开销代码-malloc必须去寻找下一个空闲段处理碎片等问题。

如果重新使用缓冲区,则无论分配到哪里,都应确保仅分配一次。这可能是有利于堆的,因为堆分配的变量不会超出范围。

对于在分配内存之后访问内存,堆栈和堆的性能应相同。

最重要的是,不建议在堆栈上分配大量数据,因为它的大小有限。 1024字节相当大,因此建议的做法是仅出于该原因将其存储在堆中。