Tidak, realloc
pada memori yang dikembalikan dari posix_memalign
tidak dijamin oleh ISO atau POSIX untuk mempertahankan keselarasan yang sama. A realloc
mungkin cukup perluas blok saat ini di alamat yang sama tetapi juga dapat memindahkan blok ke alamat lain yang penyelarasannya tidak seketat aslinya.
Jika Anda menginginkan perataan yang sama, sebaiknya alokasikan blok lain dan salin datanya.
Sayangnya, tidak ada posix_memalign_realloc
berfungsi baik dalam Spesifikasi UNIX Tunggal.
Jika Anda tidak ingin repot menyalin data setiap kali, Anda dapat mencoba realloc
dan, jika penyelarasannya tidak seperti yang diharapkan, maka dan hanya setelah itu panggil posix_memalign
untuk mendapatkan alamat yang selaras dengan benar dan menyalin data ke sana, membebaskan alamat lama setelah selesai.
Hal ini dapat mengakibatkan:
- nol salinan (jika blok saat ini dapat diperluas di tempat);
- satu salinan (jika
realloc
salinan tetapi kebetulan memberi Anda blok yang disejajarkan dengan benar); atau - dua salinan (jika
realloc
salinan dan kemudian Anda juga harus menyalin karena misalignment).
Itu mungkin juga menghasilkan lebih sedikit penyalinan daripada yang ditunjukkan tergantung pada penerapan manajemen memori yang mendasarinya. Misalnya, "salinan" mungkin hanya melibatkan pemetaan ulang blok memori daripada memindahkan data secara fisik.
Jadi, Anda mungkin ingin menyimpan beberapa statistik untuk melihat apakah skema ini bermanfaat.
Perlu diingat bahwa baik halaman manual POSIX maupun Linux tidak menentukan apakah Anda bisa atau tidak teruskan petunjuk ini ke realloc
, hanya saja Anda dapat meneruskannya ke free
.
Namun, berdasarkan kode sumber libc GNU saat ini, tampaknya berfungsi, meskipun itu bukan jaminan akan terus berfungsi di masa mendatang :-)
Ketakutan saya adalah bahwa itu akan mengalokasikan memori secara normal (penyelarasan standar) dan mengembalikan alamat offset (yaitu, bukan alamat sebenarnya yang dialokasikan, tetapi satu N
byte lebih dari itu) yang free
cukup cerdas untuk kembali ke alamat sebenarnya sebelum menenun sihirnya.
Salah satu cara melakukannya adalah dengan menyimpan aktual alamat tepat sebelum alamat yang dikembalikan meskipun hal ini tentu saja akan menyebabkan pemborosan bahkan untuk alokasi reguler.
Dalam hal ini, free
mungkin dibuat cerdas (karena spesifikasi mengatakan itu harus dapat menangani alokasi yang dilakukan oleh posix_memalign
) tetapi realloc
mungkin tidak diberikan kecerdasan yang sama (karena dokumen tidak menyebutkan hal itu).
Namun, berdasarkan GNU glibc 2.14.1, ini sebenarnya mengalokasikan lebih banyak memori daripada yang dibutuhkan kemudian mengutak-atik arena untuk mengosongkan ruang pra dan ruang pasca, sehingga alamat yang dikembalikan adalah alamat "nyata", dapat digunakan oleh free
atau realloc
.
Namun, seperti yang disebutkan, dokumentasi tidak menjamin hal ini.