memalign和posix_memalign的区别

一、背景

在大多数情况下,编译器和C库透明地帮你处理对齐问题。POSIX 标明了通过malloc( ), calloc( ), 和realloc( ) 返回的地址对于任何的C类型来说都是对齐的。在Linux中,这些函数返回的地址在32位系统是以8字节为边界对齐,在64位系统是以16字节为边界对齐的。(但是游戏服务器的linux共享内存和windows分配的虚拟内存都是需要自己关于2对齐的)

二、两者的共同点及应用领域

1)共同点

memalign和posix_memalign的目的在于分配内存时,起始地址要与2的整数次幂边界对齐

2)应用领域

1)对于某些应用如直接I/O(因为涉及对磁盘的直接访问,所以在执行I/O时必须对齐)非常有用。有时候,对于更大的边界。对,就是更大的边界,例如页面,程序员需要动态的对齐。
2)在编写内存管理器(例如垃圾收集器)时。在这种情况下,有时在较大的块大小上使用对齐的内存会很方便。这样,您可以将所有对象共有的元数据存储在分配区域底部的给定块中,并通过屏蔽对象指针的最低有效位来简单地访问它。
3)与硬件接口时(我自己从未这样做过,但是 IIRC,某些类型的块设备需要对齐的内存)。

4)linux手册原话

On many systems there are alignment restrictions, e.g. on buffers used for direct block device I/O. POSIX specifies the pathconf(path,_PC_REC_XFER_ALIGN) call that tells what alignment is needed.

5)总结

基本上,如果您不需要进行荒谬的优化级别和/或您的硬件不要求数组位于特定边界上,那么您可以忘记 posix_memalign。

三、函数定义及参数解释、注意点

1)memalign

  • 代码
void *memalign(size_t boundary, size_t size);
Returns pointer to allocated memory on success, or NULL on error
  • 参数解释
函数memalign分配size个字节的内存,起始地址是参数boundary的整数倍,而 boundary必须是2的整数次幂。
返回值为已分配内存的地址。
  • 注意点
    函数memalign并非在所有UNIX实现上都存在。SUSv3并未纳入memalign,而是规范了一个类似函数,即posix_memalign。
    (POSIX 1003.1d提供一个叫做posix_memalign( )的函数)

2)posix_memalign

  • 代码
int posix_memalign(void **memptr,size_t alignment,size_t size);
Returns 0 on success, or a positive error number on error
  • 参数解释
返回值:0表示成功,错误的话直接返回一个错误号(即通常在errno中返回的正整数)
  • 使用试例
    如果sizeof(void*)为4,就可以使用posix_memalign分配65536字节的内存,并与4096字节的边界对齐,代码如下:
int s;
void *memptr;
s = posix_memalign(&memptr,1024 * sizeof(void *)65536);
if (s != 0) {
  /* Handle error */
}

四、两者的不同点和相同点

1)不同点

1)posix_memalign已分配的内存地址通过参数memptr返回,memalign返回值为已分配内存的地址
2)posix_memalign内存与alignment参数的整数倍对齐,alignment必须是sizeof(void*)(在大多数硬件架构上是4或8个字节)与2的整数次幂两者间的乘积。而memalign分配size个字节的内存,起始地址是参数boundary的整数倍,而 boundary必须是2的整数次幂

2)相同点

1)由memalign或posix_memalign分配的内存块应该调用free来释放。

3)补充:与malloc的对比

果您需要比 malloc 更严格的对齐方式。Malloc 通常返回一个对齐的指针,以便它可以与任何原始类型一起使用(在普通台式机上通常为 8 个字节),有时您需要在其他边界上对齐内存,例如 4K 对齐等。在这种情况下,您需要memalign,那就用memalign,有些平台不支持,那就使用posix_memalign

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值