一个动态内存分配的实现在风格malloc()
和free()
平时还提到,在传球,东西长约数据类型对齐限制。显然,某些计算机硬件体系结构(CPU,寄存器和内存访问)限制了如何存储和解决某些值类型。例如,可能需要一个4字节(long
)整数必须从4的倍数地址开始存储。
主要平台(Intel和AMD,SPARC,Alpha)对内存分配和内存访问有什么限制(如果有的话),还是我可以放心地忽略在特定地址边界上对齐内存分配?
发布于 2018-05-31 09:28:30
Sparc,MIPS,Alpha和大多数其他“经典RISC”架构只允许对齐访问内存,即使在今天。未对齐的访问将导致异常,但某些操作系统将通过使用较小的加载和存储从软件中的所需地址进行复制来处理异常。应用程序代码不会知道有问题,除了性能会非常糟糕。
MIPS具有特殊的指令(lwl和lwr),可用于从未对齐的地址访问32位数量。只要编译器可以知道地址可能未对齐,它就会使用这两个指令序列,而不是正常的lw指令。
x86可以在硬件中处理未对齐的内存访问,但是与对齐的访问相比,仍然有高达3倍的性能下降。
发布于 2018-05-31 10:40:51
今天,协调仍然非常重要。如果你尝试访问奇数边界上的单词值,某些处理器(68k系列跳转到脑海)会抛出异常。今天,大多数处理器将运行两个内存周期来获取未对齐的字,但肯定会比对齐的获取更慢。其他一些处理器甚至不会抛出异常,但会从内存中获取不正确的值!
如果没有其他原因而不是性能,尝试遵循处理器的排列偏好是明智的。通常,你的编译器会处理所有的细节,但如果你在做任何你自己布局内存结构的事情,那么这是值得考虑的。
https://stackoverflow.com/questions/-100000183
复制相似问题