memset效率
来源:互联网 发布:《疯狂java讲义》 编辑:程序博客网 时间:2024/06/06 03:12
今天在CSDN上有人聊memset的效率。凑巧,我这几天也看了看glibc的几个函数的实现。
下面就扯一扯DIR/string/memset.c
其中DIR是解压glibc后的路径。我下载的是glibc-2.11。
//代码经过astyle格式化
void *
memset (dstpp, c, len)
void *dstpp;
int c;
size_t len; //前几行等同于: void * memset(void *dstpp, int c, size_t len)
{
long int dstp = (long int) dstpp;
if (len >= 8)
{
size_t xlen;
op_t cccc;
cccc = (unsigned char) c;
cccc |= cccc << 8;
cccc |= cccc << 16; // 至此已经扩成了4字节。
if (OPSIZ > 4) // 如果是64位的机器,要扩成8字节
cccc |= (cccc << 16) << 16;
while (dstp % OPSIZ != 0) //首先将dstp对齐到OPSIZE, 一边对齐一边按字节赋值。此处为1号while
{
((byte *) dstp)[0] = c;
dstp += 1;
len -= 1;
}
xlen = len / (OPSIZ * 8);
while (xlen > 0) // 2号 while
{
((op_t *) dstp)[0] = cccc;
((op_t *) dstp)[1] = cccc;