当前位置:  开发笔记 > 编程语言 > 正文

OSX缺乏memalign

如何解决《OSX缺乏memalign》经验,为你挑选了3个好方法。

我正在研究C中的一个项目,它需要memalign().真的,posix_memalign()也会这样做,但是darwin/OSX缺少这两者.

什么是鞋拔的良好解决方案?我不理解posix-C代码的许可,如果我要删掉memalign.c并把它放在我的项目中 - 我不希望任何病毒式许可LGPL-ing我的整个项目.



1> paxos1977..:

Mac OS X似乎是16字节内存对齐.

从网站引用:

我很难在MacOS X内存对齐上找到明确的声明,所以我做了自己的测试.在10.4/intel上,堆栈和堆内存都是16字节对齐的.因此移植软件的人可以停止寻找memalign()和posix_memalign().这不是必需的.


出于其他原因,您可能需要更大的对齐方式.高速缓存行(可能是64字节对齐)就是一个例子.
请注意,OS X*确实*具有posix_memalign,用于(例如)用于对齐页面边界或编译AXV库.请参见http://stackoverflow.com/a/22876707/558639
SSE在x86上保证这一点:Malloc必须返回一个指向内存的指针,该指针适合于任何类型的对象,在x86上包含SSE向量(需要16字节对齐)

2> fearless_foo..:

更新:OSX现在有 posix_memalign()

晚会,但OSX的新版本确实posix_memalign().在对齐页面边界时,您可能需要这样做.例如:

#include 

char *buffer;
int pagesize;

pagesize = sysconf(_SC_PAGE_SIZE);
if (pagesize == -1) handle_error("sysconf");

if (posix_memalign((void **)&buffer, pagesize, 4 * pagesize) != 0) {
  handle_error("posix_memalign");
}

需要注意的一点是,与参数相反memalign(),posix_memalign()**buffer返回一个整数错误代码.



3> 小智..:

应该很容易做到自己,不是吗?像下面的东西(未测试):

void *aligned_malloc( size_t size, int align )
{
    void *mem = malloc( size + (align-1) + sizeof(void*) );

    char *amem = ((char*)mem) + sizeof(void*);
    amem += align - ((uintptr)amem & (align - 1));

    ((void**)amem)[-1] = mem;
    return amem;
}

void aligned_free( void *mem )
{
    free( ((void**)mem)[-1] );
}

(感谢Jonathan Leffler)

编辑: 关于剥离另一个memalign实现,问题不是许可.相反,你遇到的困难是任何好的memalign实现都将成为堆管理器代码库的一个组成部分,而不是简单地分层在malloc/free之上.因此,将它移植到不同的堆管理器时会遇到严重问题,尤其是当您无法访问它的内部时.


在malloc调用下面,你应该添加`if(!mem)return NULL;`.
推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有