【问题标题】:explaination of glibc calloc implementation i.e public_cALLOc( )glibc malloc 实现在 public cALLOc( ) 中的解释
【发布时间】:2011-11-15 13:25:17
【问题描述】:

在 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(),这个区别有什么需要。

谢谢, 卡皮尔

【问题讨论】:

    标签: malloc glibc calloc


    【解决方案1】:

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

    【讨论】:

    • 对。这有点直观,但是只有 36 个字节的原因是有问题的
    • 因为他们通过分析确定,做更多事情会比调用memset(它本身对某些目标有一些有趣的技巧)更昂贵。
    • 这有什么依据吗?
    • 什么意思?如果它是“这是否真的提高了性能”,那么对于某些应用程序是肯定的,就像所有与性能相关的东西一样。
    猜你喜欢
    • 2020-12-15
    • 2020-09-17
    • 2016-10-31
    • 1970-01-01
    • 2012-01-17
    • 2016-12-03
    • 2012-10-21
    • 2012-03-02
    • 1970-01-01
    相关资源
    最近更新 更多