Cの特定の境界(キャッシュライン境界など)に揃えられたメモリをどのように割り当てますか?私は、理想的には可能な限り移植可能である、malloc/freeのような実装を探しています---少なくとも32ビットから64ビットのアーキテクチャ。
編集して追加:言い換えると、(現在は廃止されていますか?) memalign 関数のように動作するものを探しています。これは、freeを使用して解放できます。
これは、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]);
}
使用する 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
の標準的な代替品であり、おっしゃるように廃止されています。
どのコンパイラを使用していますか? MSVCを使用している場合は、 _aligned_malloc()
および_aligned_free()
を試すことができます。