我正在研究C中的一个项目,它需要memalign().真的,posix_memalign()也会这样做,但是darwin/OSX缺少这两者.
什么是鞋拔的良好解决方案?我不理解posix-C代码的许可,如果我要删掉memalign.c并把它放在我的项目中 - 我不希望任何病毒式许可LGPL-ing我的整个项目.
Mac OS X似乎是16字节内存对齐.
从网站引用:
我很难在MacOS X内存对齐上找到明确的声明,所以我做了自己的测试.在10.4/intel上,堆栈和堆内存都是16字节对齐的.因此移植软件的人可以停止寻找memalign()和posix_memalign().这不是必需的.
posix_memalign()
晚会,但OSX的新版本确实有posix_memalign()
.在对齐页面边界时,您可能需要这样做.例如:
#includechar *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
返回一个整数错误代码.
应该很容易做到自己,不是吗?像下面的东西(未测试):
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之上.因此,将它移植到不同的堆管理器时会遇到严重问题,尤其是当您无法访问它的内部时.