20


14

Cでアライメントされたメモリを割り当てて解放する方法

Cの特定の境界(キャッシュライン境界など)にアラインされたメモリをどのように割り当てますか? 理想的には可能な限り移植性の高いmalloc / freeのような実装を探しています。少なくとも32〜64ビットのアーキテクチャです。

編集して追加:言い換えれば、私は(今では時代遅れですか?) freeを使用して解放されます。

3 Answer


25


これは、mallocの呼び出しをカプセル化し、アライメントのために大きなバッファーを割り当て、後で解放するためにアライメントされたバッファーの直前に元の割り当てられたアドレスを保存するソリューションです。

// 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]);
}


8


posix_memalign /` free`を使用してください。

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`の標準的な代替品であり、ご指摘のとおり廃止されました。


3


どのコンパイラを使用していますか? MSVCを使用している場合は、http://msdn.microsoft.com/en-us/library/8z34s9c6%28VS.80%29.aspx [_aligned_malloc()]および `_aligned_free()`を試すことができます。