объяснение реализации glibc calloc, т.е. public_cALLOc () - PullRequest
1 голос
/ 15 ноября 2011

в 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 () для всех, зачем это различие.

спасибо, Капил

1 Ответ

2 голосов
/ 15 ноября 2011

Это трюк с производительностью.Это сохраняет вызов функции, когда выполнение «сырых» записей будет быстрее, чем это.

...