在calloc() (准确地说,是public_cALLOc())实现的glibcmalloc.c中,当它试图以两种方式从内存中抽出0时,如果字节数大于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 (),这一区别的必要性是什么。
谢谢,卡皮尔
发布于 2011-11-15 13:29:02
这是表演技巧。当执行"raw“写操作时,它保存一个函数调用的速度要快于此。
https://stackoverflow.com/questions/8137011
复制相似问题