Jak działa realloc i memcpy?
Mam dwa pytania.
- Wykonaj
realloc ()
imemcpy ()
skopiuj wpisy w tablicy w inny sposób szybciej niż tylko iterowanie po każdym elemencieO (N)
Jeśli odpowiedź brzmi tak, jak myślisz, jaka jest jego trudność - Jeśli przydzielony rozmiar jest mniejszy niż rozmiar oryginalny, czy
realloc ()
kopiuje wpisy do innej lokalizacji, czy po prostu pozostawia je w miarę zmniejszania się rozmiaru tablicy
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
8 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
http://www.embedded.com/design ... mcpy- poprawia prędkość
http://www.embedded.com/design ... speed
za bardzo dobrą analizę.
2 zależy od implementacji. Widzieć
http://www.gnu.org/software/libtool/manual/libc library/change-block-Size.html
http://www.gnu.org/software/li ... .html
dla szczegółów glibc. „W kilku implementacjach alokacji zmniejszenie rozmiaru bloku czasami wymaga jego skopiowania”.
Anonimowy użytkownik
Potwierdzenie od:
Po pierwsze, duże O. Jak powiedziałem w innym miejscu, warto przypomnieć sobie definicję dużego O, czyli pewnej funkcji
g(n)
nazywa
O(f(n))
kiedy jest stała
k
, dla którego
g(n)
≤
kf(n)
... Stała pozwala zignorować drobne szczegóły na korzyść ważnej części. Jak wszyscy już zauważyli, from
n
bajtów będzie
O (n)
w większości popularnych architektur, ponieważ bez względu na to, czego potrzebujesz, aby je przenieść
n
bajtów, po jednym kawałku na raz. Można więc napisać pierwszą, naiwną implementację w C
W rzeczywistości tak jest
O(n)
i możesz się zastanawiać, dlaczego w ogóle zawracamy sobie głowę pracą w bibliotece. jednak cechą funkcji
libc
polega na tym, że są one miejscem, w którym zapisywane są narzędzia dla określonej platformy; jeśli chcesz zoptymalizować architekturę, jest to jedno z miejsc, w których możesz to zrobić. Tak więc w
w zależności od architektury
mogą istnieć skuteczniejsze opcje wdrażania; na przykład w architekturze IBM 360 istnieje instrukcja , która przenosi dane w dużych porcjach przy użyciu bardzo wysoce zoptymalizowanego mikrokodu. Zatem zamiast tej pętli implementacja memcpy 360 może wyglądać mniej więcej tak
(Nawiasem mówiąc, nie ma gwarancji, że jest to dokładnie kod 360, ale posłuży jako ilustracja). Ta implementacja
wygląda jak
więc zamiast robić
n
omija pętlę tak, jak zrobił to kod C, po prostu wykonuje 3 instrukcje.
Jednak w rzeczywistości
biznes
dzieje się to, co robi
o (n) mikroinstrukcje
pod kocem. co
jest inny
między nimi, więc to jest stała
k
; ponieważ mikrokod jest znacznie szybszy, a instrukcja zawiera tylko trzy etapy dekodowania, to
dużo
szybciej niż wersja naiwna, ale nadal
O(n)
- tylko stale mniej.
I właśnie dlatego możesz dobrze użyć - nie jest to asymptotycznie szybsze, ale implementacja jest tak szybka, jak ktokolwiek mógłby to zrobić
na tej konkretnej architekturze
.
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
Jak powiedziano, nie będzie szybszy niż O (n), ale systemy pamięci często mają preferowane rozmiary bloków, a także, powiedzmy, można zapisać rozmiar linii pamięci podręcznej za jednym razem.
Anonimowy użytkownik
Potwierdzenie od:
malloc.c
http://sourceware.org/cgi-bin/ ... glibc
memcpy.c
http://sourceware.org/cgi-bin/ ... glibc
Sądząc po sposobie, w jaki to przeczytałem, odpowiedzi są następujące:
Anonimowy użytkownik
Potwierdzenie od:
Te używane do kopiowania mem to movsb/movsw w połączeniu z instrukcją rep.
Skonfiguruj rejestry z adresami src/trg i int count i gotowe.
Anonimowy użytkownik
Potwierdzenie od:
void * realloc (void * ptr, size_t);