web-dev-qa-db-ja.com

Cで整列されたメモリを割り当てて解放する方法

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

編集して追加:言い換えると、(現在は廃止されていますか?) memalign 関数のように動作するものを探しています。これは、freeを使用して解放できます。

22
fuad

これは、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]);
}
26
Jerome

使用する 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_memalignmemalignの標準的な代替品であり、おっしゃるように廃止されています。

どのコンパイラを使用していますか? MSVCを使用している場合は、 _aligned_malloc() および_aligned_free()を試すことができます。

3
mrkj