C で特定の境界 (キャッシュ ライン境界など) に揃えられたメモリを割り当てるにはどうすればよいでしょうか。私は、少なくとも 32 ビット アーキテクチャと 64 ビット アーキテクチャの間で、可能な限り移植性の高い malloc/free のような実装を探しています。
編集して追加: 言い換えると、私は (現在は廃止されている?) のように動作するものを探しています。メマリンこの関数は free を使用して解放できます。
ベストアンサー1
ここでの解決策は、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]);
}