实战bzero------libc

/*
 * lx_bzero.c
 *
 *  Created on: 2013年8月20日
 *      Author: lx
 */
#include "lx_string.h"
#include "lx_memcopy.h"

/*lx_bzero 将内存地址到内存地址+len的值赋0
 * 处理方式与memcpy相似
 * 1 将地址对齐到CPU支持的位宽
 * 2 将可能的按8个机器字拷贝。。。这个是为了页优化么? 求解
 * 3 按机器字拷贝
 * 4 将剩余的按字节拷贝
 * */
void lx_bzero(void *s, size_t len)
{
	long int dstp = (long int) s;
	size_t xlen;
	const op_t zero = 0;

	if(len >= OP_T_THRES)
	{
		while (dstp % OPSIZ != 0)
		{
		  ((unsigned char *) dstp)[0] = 0;
		  dstp += 1;
		  len -= 1;
		}

		xlen = len / (OPSIZ * 8);
		while (xlen != 0)
		{
		  ((op_t *) dstp)[0] = zero;
		  ((op_t *) dstp)[1] = zero;
		  ((op_t *) dstp)[2] = zero;
		  ((op_t *) dstp)[3] = zero;
		  ((op_t *) dstp)[4] = zero;
		  ((op_t *) dstp)[5] = zero;
		  ((op_t *) dstp)[6] = zero;
		  ((op_t *) dstp)[7] = zero;
		  dstp += 8 * OPSIZ;
		  xlen -= 1;
		}

		 xlen = len / OPSIZ;
	  while (xlen != 0)
		{
		  ((op_t *) dstp)[0] = zero;
		  dstp += OPSIZ;
		  xlen -= 1;
		}
		  len %= OPSIZ;
	}

	/* Write the last few bytes.  */
  while (len != 0)
	{
	  ((unsigned char *) dstp)[0] = 0;
	  dstp += 1;
	  len -= 1;
	}
}

你可能感兴趣的:(实战bzero------libc)