質問

どのようにC内の特定の境界(例えば、キャッシュラインの境界)に整列のメモリを割り当てていますか?私は理想的には少なくとも32および64ビットアーキテクチャ間---できるだけポータブルになり、実装のように/無料malloc関数を探しています。

編集追加する:つまり、私は<のhref = "http://www.mkssoftware.com/docs/man3/memalign.3(?現在は廃止)のように振る舞うと何かを探しています。無料使用して解放することができ、ASP」のrel = "noreferrer">あるmemalign の機能、。

役に立ちましたか?

解決

ここで、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()ます。

scroll top