2011-11-15 3 views
1

の2つの方法で行っているメモリを0にしようとしたとき、質問があることであるglibcのcalloc実装の説明、すなわちcalloc()(正確にはpublic_cALLOc())の実装のglibc malloc.cのpublic_cALLOc()

の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; 
     } 
     } 
     }  
    --------------------------------- 

:)(その後すぐに36のmemsetよりも大きいが、このような何か、それ以外の場合は、特に0バイト単位を置くと呼ばれていますなぜ私たちはすべての人にmemset()を直接行うのではなく、この区別の必要性は何ですか?

おかげで、 カピル

答えて

2

それはパフォーマンスのトリックです。これは、 "生の"書き込みを行うよりも速い場合に関数呼び出しを保存します。

+0

右。これはちょっと直感的でしたが、36バイトだけが問題のポイント – Kapil

+0

である理由は、プロファイリングを通じて、より多くの処理が 'memset'(これはいくつかのターゲットで興味深いトリックがあります)を呼び出すよりも高価になると判断したためです。 – Mat

+0

それを超えて、memsetはもっと巧みにそれを行います... –

関連する問題