我们什么时候需要使用posix_memalign而不是malloc?

com*_*fan 19 c alignment

似乎posix_memalign让你选择定制alignment,但什么时候需要?

malloc 已经在内部完成了对齐工作.

UPDATE

我问这个的确切原因是因为我看到nginx这样做了ngx_memalign(NGX_POOL_ALIGNMENT, size, log);,这里NGX_POOL_ALIGNMENT定义为16,nginxs.googlecode.com/svn-history/trunk/src/core/ngx_palloc.c

Dir*_*irk 12

基本上,如果你需要比malloc更强的对齐方式给你.Malloc通常返回一个对齐的指针,它可以与任何基本类型一起使用(通常,在普通台式机上使用8个字节).

但是,有时您需要在其他边界上对齐内存,例如4K对齐等.在这种情况下,您需要memalign.

你需要这个,例如,

  • 在编写内存管理器(例如垃圾收集器)时.在这种情况下,使用在较大块大小上对齐的内存有时很方便.这样,您可以存储分配区域底部给定块中所有对象共有的元数据,并通过屏蔽对象指针的最低有效位来访问它.
  • 当与硬件连接时(我自己从未这样做过,但IIRC,某些类型的块设备需要对齐内存).有关详细信息,请参阅nm的答案.

  • 更多示例:SIMD类型可能需要比"malloc"提供的更多对齐.代码播放非常花哨的性能技巧可能需要对应于缓存行大小的对齐 - 如果您正在编写动态链接器(即将可执行文件加载到内存中的代码),这可能是最常见的,您加载的代码可能需要其功能在缓存行边界上对齐. (2认同)

R..*_*R.. 6

posix_memalign据我所知,唯一的好处是:

  1. 为特定于硬件的目的分配页面对齐(通常为4096或更大的对齐)内存.
  2. 邪恶的黑客,你把N指针的低位保持为零,这样你就可以N在低位存储一个位整数.:-)

  • 听起来 nginx 正在管理自己的内存池,基本上是在其自己分配的块之上复制 `malloc`,并希望确保它可以提供最多 16 个字节的对齐。我不知道为什么它会关心这个,因为 `malloc` 已经为任何 C 类型提供了足够的对齐,如果你使用了一个由 `malloc` 获得的块并且在切片时没有应用未对齐的偏移量,它将保持一致。从过去关于nginx的一系列问题来看,我质疑nginx的作者是否理解他们首先使用`memalign`的原因...... (2认同)