C 以二的幂分配内存更好吗?

C 以二的幂分配内存更好吗?,c,memory-management,malloc,C,Memory Management,Malloc,当我们使用malloc()分配内存时,我们应该给出2的幂的大小吗?或者我们只给出我们需要的确切尺寸? 喜欢 //char *ptr= malloc( 200 ); char *ptr= malloc( 256 );//instead of 200 we use 256 如果最好给出2的幂的大小,原因是什么?为什么更好 谢谢 编辑 我之所以感到困惑,是因为我引用了乔尔博客上的一段话 聪明的程序员将 潜在的malloc破坏 始终分配内存块 大小为2的幂。您可以 知道,4字节,8字节,16字节,

当我们使用
malloc()
分配内存时,我们应该给出2的幂的大小吗?或者我们只给出我们需要的确切尺寸?
喜欢

//char *ptr= malloc( 200 ); 
char *ptr= malloc( 256 );//instead of 200 we use 256
如果最好给出2的幂的大小,原因是什么?为什么更好

谢谢

编辑

我之所以感到困惑,是因为我引用了乔尔博客上的一段话

聪明的程序员将 潜在的malloc破坏 始终分配内存块 大小为2的幂。您可以 知道,4字节,8字节,16字节, 用于的18446744073709551616字节等 理由应该是直观的 任何玩乐高的人,这个 最大限度地减少怪异的行为 自由市场上的碎片化 链条虽然看起来像这样 浪费空间,也很容易看到 它如何从不浪费超过50%的资源 空间。所以你的程序使用no 内存是它的两倍多 需要,这不是一个大问题 成交

对不起,我应该早点发布上面的报价。我道歉

到目前为止,大多数答复都说,按2的幂分配内存是个坏主意,那么在哪种情况下,最好遵循Joel关于
malloc()
的观点?他为什么这么说?上述建议现在过时了吗

请解释一下。
谢谢

这可能是真的,但肯定不是更好

只要在需要时分配所需的内存,并在完成后立即释放


浪费资源的程序太多了,不要让你的程序成为浪费资源的程序之一。

只需给出你需要的确切大小即可。两个大小的幂可能“更好”的唯一原因是允许更快的分配和/或避免内存碎片

然而,任何与效率相关的非平凡的malloc实现都会在适当的时候以这种方式对内部分配进行取整。你不需要关心“帮助”马洛克;malloc可以自己做得很好

编辑:

作为对您引用的Joel on Software文章的回应,Joel在该部分的观点(如果没有您引用的段落后面的上下文,很难正确识别)是,如果您希望经常重新分配缓冲区,那么最好是成倍地分配,而不是累加地分配。实际上,这就是<>代码> STD::String 和 STD::C++中的向量< /代码>类(除此之外)。 这是一个改进的原因,不是因为您通过提供方便的数字来帮助
malloc
,而是因为内存分配是一个昂贵的操作,并且您正试图将执行此操作的次数最小化。乔尔提出了一个时空权衡的具体例子。他认为,在许多需要动态改变内存量的情况下,最好是浪费一些空间(通过在每次扩展时分配两倍于所需的空间),以节省每次需要更多字节时重复添加
n
字节内存所需的时间

乘数不必是2:您可以分配最多三倍于您需要的空间,并以三次方的方式分配,或者分配最多五十七倍于您需要的空间,并以五十七次方的方式分配。过度分配越多,重新分配的频率就越低,但浪费的内存就越多。以二的幂进行分配,它最多使用所需内存的两倍,这恰好是一个很好的折衷起点,除非您对自己的需求有了更好的了解

他顺便提到,这有助于减少“自由链中的碎片”,但其原因更多是因为分配的数量和一致性,而不是它们的确切规模。首先,分配和取消分配内存的次数越多,就越有可能对堆进行分段,无论分配的内存大小如何。其次,如果使用相同的乘法调整算法动态调整多个缓冲区的大小,那么如果一个缓冲区的大小从32调整到64,另一个缓冲区的大小从16调整到32,那么第二个缓冲区的重新分配可能正好适合第一个缓冲区的位置。如果一个从25调整到60,另一个从16调整到26,情况就不会如此


同样,如果您只执行一次分配步骤,那么他所说的任何内容都不适用。

这完全取决于给定的
libc
实现
malloc(3)
。由该实现以其认为合适的任何顺序保留堆块


回答这个问题-不,不是“更好”(这里的“更好”是指…?)。如果您要求的大小太小,
malloc(3)
将在内部保留更大的块,因此只需坚持您的确切大小。

这有点无关紧要

Malloc实际上分配的内存比您请求的略多,因为它有自己的头文件要处理。因此,最佳存储可能类似于
4k-12
字节。。。但这取决于实施情况


在任何情况下,作为一种优化技术,您都没有理由舍入超过所需的存储空间。

您可能希望根据处理器的字大小分配内存;任何旧的2次幂都不行

如果处理器有一个32位字(4字节),则以4字节为单位进行分配。按2字节分配可能没有帮助,因为处理器更喜欢以4字节边界开始数据

另一方面,这可能是一个微观优化。大多数内存分配