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()を直接行うのではなく、この区別の必要性は何ですか?
おかげで、 カピル
右。これはちょっと直感的でしたが、36バイトだけが問題のポイント – Kapil
である理由は、プロファイリングを通じて、より多くの処理が 'memset'(これはいくつかのターゲットで興味深いトリックがあります)を呼び出すよりも高価になると判断したためです。 – Mat
それを超えて、memsetはもっと巧みにそれを行います... –