mallocだけでは不可能だと思います。 memalign() を使用できます:
char *data = memalign(PAGESIZE, alloc_size);
どこ PAGESIZE
はページのサイズで、alloc_size
割り当てられるメモリのサイズです。
ページのサイズは sysconf(_SC_PAGESIZE)
でわかります .
このために使用する関数があります。
何らかの理由でそれができない場合、これは通常、ブロック サイズを割り当てサイズに加算してから、整数演算のトリックを使用してポインターを丸めます。
このようなもの:
/* Note that alignment must be a power of two. */
void * allocate_aligned(size_t size, size_t alignment)
{
const size_t mask = alignment - 1;
const uintptr_t mem = (uintptr_t) malloc(size + alignment);
return (void *) ((mem + mask) & ~mask);
}
これはあまり深くテストされていませんが、アイデアはわかります。
free()
への適切なポインタを把握できなくなることに注意してください。 記憶は後で。これを修正するには、機械を追加する必要があります:
typedef struct {
void *aligned;
} AlignedMemory;
AlignedMemory * allocate_aligned2(size_t size, size_t alignment)
{
const size_t mask = alignment - 1;
AlignedMemory *am = malloc(sizeof *am + size + alignment);
am->aligned = (void *) ((((uintptr_t) (am + 1)) + mask) & ~mask);
return am;
}
これにより、ポインターのトリックが少しラップされ、free()
できるポインターが得られます。 、ただし、 aligned
に逆参照する必要があります 適切に配置されたポインターを取得するためのポインター。