如何在C语言中分配和释放对齐内存

如何在C语言中分配和释放对齐内存,c,alignment,memory-mapped-files,memory-alignment,C,Alignment,Memory Mapped Files,Memory Alignment,如何分配与C中特定边界对齐的内存(例如缓存线边界)?我正在寻找类似malloc/free的实现,理想情况下应该尽可能具有可移植性——至少在32位和64位体系结构之间 编辑以添加:换句话说,我正在寻找类似(现在已过时的?)函数的东西,它可以使用free释放。您使用的是什么编译器?如果你在MSVC上,你可以尝试和\u aligned\u free()这里有一个解决方案,它封装了对malloc的调用,为对齐目的分配了一个更大的缓冲区,并在对齐的缓冲区之前存储原始分配的地址,以便稍后调用free //

如何分配与C中特定边界对齐的内存(例如缓存线边界)?我正在寻找类似malloc/free的实现,理想情况下应该尽可能具有可移植性——至少在32位和64位体系结构之间


编辑以添加:换句话说,我正在寻找类似(现在已过时的?)函数的东西,它可以使用free释放。

您使用的是什么编译器?如果你在MSVC上,你可以尝试和
\u aligned\u free()

这里有一个解决方案,它封装了对malloc的调用,为对齐目的分配了一个更大的缓冲区,并在对齐的缓冲区之前存储原始分配的地址,以便稍后调用free

// cache line
#define ALIGN 64

void *aligned_malloc(int size) {
    void *mem = malloc(size+ALIGN+sizeof(void*));
    void **ptr = (void**)((uintptr_t)(mem+ALIGN+sizeof(void*)) & ~(ALIGN-1));
    ptr[-1] = mem;
    return ptr;
}

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

使用posix_memalign/
免费

int posix_memalign(void **memptr, size_t alignment, size_t size); 

void* ptr;
int rc = posix_memalign(&ptr, alignment, size);
...
free(ptr)

posix_memalign
memalign
的标准替代品,正如您所提到的,它已经过时了。

您检查过这两个答案了吗。我想要一些函数更像malloc,返回一个值作为对齐指针,然后有另一个类似于free的函数,在该指针上调用。应用解决方案(如您指出的解决方案)需要传递两个值,或者在需要时重新计算路线。我正在寻找类似memalign的产品。感谢您指出这些答案。在适当的机器上有
posix_memalign()
memalign()
有不同的接口。Sun针对Solaris/SPARC的编译器和针对Linux/x86的gcc可能重复,例如Sun支持memalign():我没有看到任何迹象表明memalign()在当前的GLUBC中被禁止:随着新的标准,您应该考虑将CAST替换为“代码>长< /Cord>”,并将其转换为<代码> uTutpTrtt @ Jermoe,特别是,该代码在64位上不起作用。Windows@Jerome-您说
malloc(size+ALIGN+sizeof(void*))
而不是
malloc(size+ALIGN-1+sizeof)的任何特殊原因(void*)
?如果要对齐到n字节边界,那么最多只需要n–1个额外字节。这段代码在返回语句中使用void**时有点混乱。可以添加+ALIGN-1而不是+ALIGN吗?void aligned_malloc(int size){void*mem=malloc(size+ALIGN-1+sizeof(void));void ptr=(void)(长)(mem+ALIGN-1+sizeof(void*)&~(ALIGN-1));ptr[-1]=mem;return ptr;}