pax*_*977 13
Mac OS X似乎是16字节内存对齐.
从网站引用:
我很难在MacOS X内存对齐上找到明确的声明,所以我做了自己的测试.在10.4/intel上,堆栈和堆内存都是16字节对齐的.因此移植软件的人可以停止寻找memalign()和posix_memalign().这不是必需的.
fea*_*ool 10
posix_memalign()
晚会,但OSX的新版本确实有posix_memalign()
.在对齐页面边界时,您可能需要这样做.例如:
#include <stdlib.h>
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");
}
Run Code Online (Sandbox Code Playgroud)
需要注意的一点是,与参数相反memalign()
,posix_memalign()
它**buffer
返回一个整数错误代码.
小智 6
应该很容易做到自己,不是吗?像下面的东西(未测试):
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] );
}
Run Code Online (Sandbox Code Playgroud)
(感谢Jonathan Leffler)
编辑: 关于剥离另一个memalign实现,问题不是许可.相反,你遇到的困难是任何好的memalign实现都将成为堆管理器代码库的一个组成部分,而不是简单地分层在malloc/free之上.因此,将它移植到不同的堆管理器时会遇到严重问题,尤其是当您无法访问它的内部时.