2017-08-04 70 views
18

ör .:Gerçekten, realloc() desteklenmesini destekleyen bir sürümü yok mu?

#include <stdlib.h> 
int posix_memalign(void **memptr, size_t alignment, size_t size); 
void *aligned_alloc(size_t alignment, size_t size); 

#include <malloc.h> 
void *memalign(size_t alignment, size_t size); 

(POSIX'e sırasıyla glibc'nin ve Linux libc orjinli), saygıdeğer malloc() birkaç hizalanmış versiyonlarını Orada mevcuttur. Ancak - Hizalamayı destekleyen realloc() versiyonundan bahsedilmiş gibi görünmüyor. Gerçekten hiç uygulanmadı mı? Hizalanmamış realloc()'un hizalı malloc() değişkenlerinde hizalanmış bir yığın bellek arayışını birleştirmek oldukça kolay görünüyor.

İlgili:

Does realloc keep the memory alignment of posix_memalign?

+0

Evet. Birçok nedenden ötürü yoktur. Bir tanesi, sıralı tahsis edilmiş fonksiyonların, hizalanmış bloğun veri boyutu hakkında bilgi kaydetmemesi ve hiçbir veri kopyasının mümkün olmamasıdır. Uygulama geliştiricisine bırakıldı. Birçok yıl önce çok aktif bir şekilde tartışılan birçok neden vardı - ayrıntılar için uygun posta listesi arşivlerine bakın –

+3

@PeterJ: Hizalanmış tahsis işlevleri, 'malloc()' kaydedilenden daha fazla _pay bilgi sakladığını mı söylüyorsunuz? Şüphe ediyorum ki ... şüphesiz, eğer bunu biraz daha tartışabilirseniz, bu tartışmanın bir kısmıyla bağlantı kurabilirsiniz, lütfen bir cevap gönderin. – einpoklum

+0

Daha az değil. Konu forum için çok karmaşık. Açıklama için posta listesi arşivlerine göz atın. –

cevap

3

Bağlantısızlar realloc sadece _aligned_realloc fonksiyonu ile Microsoft uygulanmaktadır. Linux'ta tanımlı POSIX sürümü yok ve uygulama yok. Neden olmasa hiç anlamadım, çünkü glibc kodunda bu kadar karmaşık görünmüyor. Bence bu, geniş SIMD talimatlarının ortaya çıkmasını göz önünde bulundurarak birisinin uygulamaya koymasından önce bir zaman meselesi.

Şu anda yeni bir hizalanmış bellek bloğu ayırın, içeriği kopyalayın ve eski işaretçiyi boşaltın. Bu, uygulamanızı yine de yavaşlatmamalıdır.

+2

Sonuncuyu düşürdüyseniz +1 yapardınız cümle, ben o clueless değilim ... ayrıca, mümkünse resmi kaynakları istiyoruz. – einpoklum

+2

Ya kendi bellek havuzunuz var ve kendi hizalı realloc'unuzu uygulayabilirsiniz, ya memalign + memcpy + free kullanabilirsiniz, ya da "o clueless değil" gibi daha yararlı bir cevap bekleyebilirsiniz. – yakoudbz