calloc è probabile che solo implementato come qualcosa di simile a:
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;
}
Quindi aggiunge solo un moltiplicano prima e una chiara dopo il malloc.
malloc potrebbe essere (ma probabilmente non è mai) implementato come:
void * malloc(size_t size) {
return realloc(NULL, size);
}
perché si può passare realloc un puntatore NULL come il puntatore del precedente, ma malloc è più probabile che non implementato così perché sarebbe rallentare tutti i mallocs e poiché realloc utilizza probabilmente malloc.
La cosa principale da sapere su realloc è che è spesso in grado di determinare la dimensione effettiva del blocco di memoria restituita da una qualsiasi delle routine di allocazione dell'heap e vedere se il blocco è già sufficientemente grande o in alcuni casi se sarebbe meglio cercare di ridurre il blocco o spostarlo.
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 è usato di più perché è il più semplice. I programmatori possono spesso rendere le loro allocazioni abbastanza grandi per cominciare da non doversi preoccupare di ridimensionarle con realloc, e molto spesso la cancellazione della memoria non è necessaria.
Ci sono diversi comportamenti tra le diverse librerie e si possono anche collegare programmi con altre versioni solo per ottenere questo comportamento diverso senza (di solito senza modificare il compilatore).
Alcune librerie malloc sono per il debug e il rilevamento degli errori. Altri potrebbero offrire prestazioni migliori.Alcuni sono ottimizzati per allocare memoria per diversi thread contemporaneamente e per evitare che i vari thread debbano bloccare l'intero heap per eseguire un'allocazione o gratuitamente.
Tutti però dovrebbero fornire la stessa semantica dal punto di vista delle applicazioni.
Non dimenticare di [array a lunghezza variabile] (http://stackoverflow.com/questions/2759294/variable-length-array) :) –