malloc()/ free()的对齐限制

8 c memory malloc allocation

较旧的K&R(第二版)和其他我读过的C语言文本讨论了动态内存分配器的实现方式,malloc()并且free()通常还提及有关数据类型对齐限制的内容.显然,某些计算机硬件体系结构(CPU,寄存器和内存访问)限制了如何存储和处理某些值类型.例如,可能要求long必须从4的倍数地址开始存储4字节()整数.

主要平台(英特尔和AMD,SPARC,Alpha)对内存分配和内存访问有什么限制(如果有的话),还是可以安全地忽略在特定地址边界上对齐内存分配?

DGe*_*try 6

Sparc,MIPS,Alpha和大多数其他"经典RISC"架构只允许对内存进行对齐访问,即使在今天也是如此.未对齐的访问将导致异常,但某些操作系统将通过使用较小的加载和存储从软件中的所需地址进行复制来处理异常.应用程序代码不会知道存在问题,除了性能非常糟糕.

MIPS具有特殊指令(lwl和lwr),可用于从未对齐地址访问32位数量.每当编译器可以告诉该地址可能未对齐时,它将使用这两个指令序列而不是正常的lw指令.

x86可以毫无例外地处理硬件中未对齐的内存访问,但与对齐访问相比,性能仍然高达3倍.

Ulrich Drepper写了一篇关于这个和其他与记忆相关的主题的综合论文,每个程序员应该了解的关于记忆的内容.这是一篇很长的文章,但充满了耐嚼的善良.


Gre*_*ill 4

今天,协调仍然非常重要。如果您尝试访问奇数边界上的字值,某些处理器(首先想到的是 68k 系列)会抛出异常。如今,大多数处理器将运行两个内存周期来获取未对齐的字,但这肯定会比对齐的获取慢。其他一些处理器甚至不会抛出异常,但会从内存中获取不正确的值!

如果除了性能之外没有其他原因,明智的做法是尝试遵循处理器的对齐首选项。通常,您的编译器会处理所有细节,但如果您正在做任何自己布置内存结构的事情,那么值得考虑。