2017-08-04 64 views
18

Istnieje kilka wersji wyrównane czcigodnego malloc(), np .:Czy naprawdę nie ma wersji realloc() obsługującej wyrównanie?

#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); 

(pochodzące POSIX glibc i Linux libc odpowiednio). Ale - nie mogę znaleźć żadnej wzmianki o wersji realloc(), która obsługuje wyrównanie. Czy to naprawdę nigdy nie zostało zrealizowane? Wydaje się dość banalne połączenie funkcji niezaokrąglonego realloc() z wyszukiwaniem wyrównanego fragmentu pamięci w dopasowanych wariantach malloc().

pokrewne:

Does realloc keep the memory alignment of posix_memalign?

+0

Tak. Nie ma z wielu powodów. Jedną z nich jest to, że przydzielone alokowane funkcje nie zapisują informacji o rozmiarze danych bloku, którego dotyczą, i żadna kopia danych nie jest możliwa. Zostało to pozostawione deweloperowi aplikacji. Było wiele powodów, bardzo aktywnie dyskutowanych wiele lat temu - zobacz odpowiednie archiwa listy mailingowej dla szczegółów –

+3

@PeterJ: Czy mówisz, że wyrównane funkcje alokacji zapisują _less_ informacje niż to, co 'malloc()' zapisuje? Bardzo w to wątpię ... w każdym razie, jeśli uda ci się to jeszcze bardziej, najlepiej z linkiem do tej dyskusji, opublikuj odpowiedź. – einpoklum

+0

Nie mniej. Temat jest zbyt skomplikowany na forum. Przejrzyj archiwa listy adresowej w celu wyjaśnienia. –

Odpowiedz

3

wyrównany realloc jest realizowany tylko w Microsoft z funkcją _aligned_realloc. Brak wersji POSIX i brak implementacji w systemie Linux. Nigdy jednak nie rozumiałem, dlaczego tak jest, ponieważ kodowanie w glibc nie jest tak skomplikowane. Myślę, że to kwestia czasu, zanim ktoś go wdroży, biorąc pod uwagę pojawienie się szerokich instrukcji SIMD.

W tej chwili wystarczy przydzielić nowy blok wyrównanej pamięci, skopiuj zawartość i zwolnij stary wskaźnik. To jednak nie powinno spowolnić twojej aplikacji.

+2

Otrzymałby +1 od Ciebie, jeśli upuściłeś ostatni zdanie, nie jestem aż tak nieświadomy ... także, jeśli to możliwe, chcemy oficjalne źródła. – einpoklum

+2

Albo masz własną pulę pamięci i możesz zaimplementować własny wyrównany realloc, albo użyjesz memalign + memcpy + free, albo możesz poczekać na bardziej pomocną odpowiedź, ponieważ nie jesteś "bezmyślny". – yakoudbz