2016-07-24 12 views
1

mallocは任意の位置合わせを許可していません。私たちはこれを自分自身で行うことができますが、別のポインターの場所で終わります。無料にはオリジナルが必要です。mallocポインタを調整する

mallocに新しいポインタを知らせる方法はありますか?それで、それ自体が調整でき、古いポインタ/オフセットを保存する必要はありませんか?

+0

があるC11を信じますか? – Downvoter

+0

与えられたポインタを変更した場合、それを覚えていたり、元に戻したりすることはできません。 –

+0

@Downvoter多かれ少なかれ。私はそんなに整列したものを使うことはできません。私は古いから元を計算することはできません。 – AbstractDissonance

答えて

2

C11は、アライメントの指定をサポートするaligned_allocを導入しています。 POSIXでは、posix_memalign(3)のようになります。これは、sizeof(void*)の倍数の2の累乗をサポートしています。

また、通常の場合はmallocで十分です。 mallocのアライメントはすべての割り当てに対して_Alignof(max_align_t)です。

C11が利用できない場合、posix_memalign(3)があります。 Windowsの場合は、_aligned_allocがMSVC 2015で始まり、VirtualAllocを使用してページアラインバッファを割り当てます。

これらのいずれも動作しない場合は、mallocの上に独自のソリューションをロールバックする必要があります。次の整列されたアドレスを取得し、先行する2つのバイトの整列を保存します。無料のラッパーを呼び出すときは、先行する2バイトを取り出し、それらをポインタから減算して結果を解放します。

1

まあ、私はあなたが効果的にアライメントをmalloc` `伝える意味で、このような獣

Defined in header <stdlib.h> 

void *aligned_alloc(size_t alignment, size_t size); 
関連する問題