calloc jest prawdopodobnie właśnie wdrażane jako coś podobnego do:
void * calloc(size_t nmemb, size_t size) {
size_t len = nmemb * size);
void * ptr = malloc(len);
if (ptr) {
return memset(ptr, 0, len);
}
return ptr;
}
Więc to tylko dodaje pomnożyć przed i jasne po malloc.
malloc może być (ale prawdopodobnie nie jest w ogóle) realizowane jako:
void * malloc(size_t size) {
return realloc(NULL, size);
}
ponieważ można przekazać realloc wskaźnik NULL jak poprzedni wskaźnik, ale malloc najprawdopodobniej nie realizowane tak, bo to by spowolnić wszystkie mallocs i ponieważ realloc prawdopodobnie używa malloc.
Najważniejszą rzeczą na temat realloc jest to, że często jest w stanie określić rzeczywisty rozmiar bloku pamięci, który zwróciły wszystkie procedury przydzielania sterty i sprawdzić, czy blok jest wystarczająco duży, czy w niektórych przypadkach, jeśli najlepiej byłoby zmniejszyć blok lub przesunąć go.
void realloc(void * ptr, size_t size) {
size_t alen = MALLOC_LENGTH_OF(ptr); // this just stands for some method of determining
// the size of the block that was allocated, and could
// be looking it up in a table or looking at a place
// several bytes before the pointer, or some other
// implementation specific thing
if (0 == size) {
free(ptr);
return NULL;
}
if (alen >= size) {
return ptr; // big enough, and not worrying about it being too big
}
void new_ptr = malloc(size); // since I said that malloc most likely isn't
// implemented using realloc using malloc here is ok
if (new_ptr && ptr) {
memcpy(new_ptr, ptr, alen);
}
free(ptr);
return new_ptr;
}
Malloc jest używany częściej, ponieważ jest najprostszy. Programiści często mogą na tyle dużą ilość alokacji, aby zacząć od tego, że nie muszą się martwić o zmianę ich rozmiaru za pomocą realloc, a bardzo często czyszczenie pamięci nie jest potrzebne.
Istnieją różne zachowania między różnymi bibliotekami, a nawet można łączyć programy z innymi wersjami, aby uzyskać takie zachowanie bez (zwykle bez zmiany kompilatora).
Niektóre biblioteki malloc służą do debugowania i wykrywania błędów. Inni mogą oferować lepszą wydajność.Niektóre są zoptymalizowane do przydzielania pamięci dla kilku różnych wątków w tym samym czasie i unikają różnych wątków wymagających zablokowania całej sterty, aby wykonać alokację lub bezpłatnie.
Wszystkie powinny jednak zapewniać tę samą semantykę z perspektywy aplikacji.
Nie zapomnij o [tablicach o zmiennej długości] (http://stackoverflow.com/questions/2759294/variable-length-array) :) –