我有一个1024字节的小缓冲区,用于存储临时数据,然后将其写入更大的缓冲区。我正在重复使用这个小缓冲区几次。
在堆而不是堆栈上创建此缓冲区是否对性能有好处?
它是现有代码,因此是在堆上完成的,但是我不确定使用堆栈是否会更快,或者首先使用堆的原因到底是什么。
有什么想法吗?这是C代码。
答案 0 :(得分:2)
如果您正在为非常小的系统编写代码,则可能需要使用malloc
(或相关例程之一,例如calloc
)来获取缓冲区,以免使用限制堆栈空间。
否则,在现代系统上,需要使用1024个字节的堆栈空间,并且在堆栈上创建缓冲区通常比使用malloc
更快。 (正常的malloc
调用至少需要一定数量的簿记工作,而堆栈分配则不需要。但是,如果例程仅使用malloc
分配固定大小的缓冲区,使用它并释放它,编译器可能会始终将缓冲区优化为堆栈分配,在这种情况下,它们将是等效的。)
作为参考,在macOS上,Apple的工具默认为主堆栈的空间为8 MiB,每个线程的空间为2 MiB。
答案 1 :(得分:1)
通常,堆栈分配总是比堆分配快。
这是因为堆栈分配就像对堆栈指针的一次写入一样容易,而动态内存分配在分配期间包含许多开销代码-malloc
必须去寻找下一个空闲段处理碎片等问题。
如果重新使用缓冲区,则无论分配到哪里,都应确保仅分配一次。这可能是有利于堆的,因为堆分配的变量不会超出范围。
对于在分配内存之后访问内存,堆栈和堆的性能应相同。
最重要的是,不建议在堆栈上分配大量数据,因为它的大小有限。 1024字节相当大,因此建议的做法是仅出于该原因将其存储在堆中。