Saya pikir tidak mungkin hanya dengan malloc. Anda dapat menggunakan memalign():
char *data = memalign(PAGESIZE, alloc_size);
Dimana PAGESIZE
adalah ukuran halaman dan alloc_size
adalah ukuran memori yang akan dialokasikan.
Ukuran halaman dapat ditemukan dengan sysconf(_SC_PAGESIZE)
.
Ada fungsi untuk ini yang seharusnya Anda gunakan.
Jika Anda tidak bisa, karena alasan apa pun, cara ini umumnya dilakukan adalah dengan menambahkan ukuran blok ke ukuran alokasi, lalu menggunakan tipuan matematika bilangan bulat untuk membulatkan penunjuk.
Sesuatu seperti ini:
/* 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);
}
Ini belum diuji secara mendalam tetapi Anda mendapatkan idenya.
Perhatikan bahwa tidak mungkin menemukan pointer yang tepat ke free()
memori nanti. Untuk memperbaikinya, kami harus menambahkan beberapa mesin tambahan:
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;
}
Ini membungkus tipuan pointer sedikit, dan memberi Anda pointer Anda dapat free()
, tetapi Anda perlu melakukan dereferensi ke aligned
penunjuk untuk mendapatkan penunjuk yang disejajarkan dengan benar.