calloc, вероятно, просто реализован как нечто похожее на:
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;
}
Так что он просто добавляет умножение до и очистку после malloc.
malloc может быть (но, вероятно, нет)t) реализовано следующим образом:
void * malloc(size_t size) {
return realloc(NULL, size);
}
, поскольку вы можете передавать realloc указатель NULL в качестве предыдущего указателя, но malloc, скорее всего, не реализован таким образом, поскольку он будет замедлять все malloc и потому что realloc, вероятно, использует malloc.
Главное, что нужно знать о realloc, это то, что он часто способен определить фактический размер блока памяти, который вернула любая из подпрограмм выделения кучи, и посмотреть, достаточно ли большой блок уже или в некоторыхв случаях, если лучше попытаться уменьшить блок или переместить его.
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 используется чаще, потому что он наиболее прост.Программисты часто могут сделать свои выделения достаточно большими, чтобы начать с того, что им не нужно беспокоиться об изменении их размера с помощью realloc, и очень часто очистка памяти не требуется.
В разных библиотеках существует разное поведение, иВы даже можете связать программы с другими версиями просто для того, чтобы добиться такого поведения без (обычно без изменения компилятора).
Некоторые библиотеки malloc предназначены для отладки и обнаружения ошибок.Другие могут предложить лучшую производительность.Некоторые оптимизированы для одновременного выделения памяти нескольким различным потокам и позволяют избежать того, что разные потоки должны блокировать всю кучу для выполнения выделения или освобождения.
Все они должны предоставлять одинаковую семантику изперспективы приложений, хотя.