в glibc malloc.c для реализации calloc () (точнее, public_cALLOc ()), когда он пытается обнулить память, которую он выполняет двумя способами, если число байтов больше 36, то сразу же memset ( ) вызывается в противном случае он специально ставит 0 в порядке байта, примерно так:
Glibc-2,13 / таНос / malloc.c
void * public_cALLOc()
{
.....
int_malloc();
...
...
/* Unroll clear of <= 36 bytes (72 if 8byte sizes). We know that
contents have an odd number of INTERNAL_SIZE_T-sized words;
minimally 3. */
...
if (nclears > 9)
MALLOC_ZERO(d, clearsize); /* this is nothing but memset(d,0,clearsize) */
else {
*(d+0) = 0;
*(d+1) = 0;
if (nclears > 4) {
*(d+2) = 0;
*(d+3) = 0;
if (nclears > 6) {
*(d+4) = 0;
*(d+5) = 0;
if (nclears > 8) {
*(d+6) = 0;
*(d+7) = 0;
*(d+8) = 0;
}
}
}
---------------------------------
вопрос в том, почему мы не делаем напрямую memset () для всех, зачем это различие.
спасибо,
Капил