glibc calloc实现的解释i.n public cALLOc()

时间:2011-11-15 13:25:18

标签: malloc glibc calloc

在glibc malloc.c中用于calloc()(正是,public_cALLOc())实现,当它尝试以两种方式执行内存时,如果字节数大于36则直接使用memset( )被调用,否则它按字节顺序排列0,类似这样:

的glibc-2.13 /的malloc / 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 个答案:

答案 0 :(得分:2)

这是一个表演技巧。当执行“原始”写入时,它会保存函数调用。