memset、memcpy函数优化

影响拷贝速度的因素

  1. 一次循环拷贝数据的字节数
  2. 地址是否对齐

在地址不对齐的情况下,memset和memcpy在是一个char到char的拷贝的循环,一个字节一个字节的拷贝
在地址对齐的情况下,按照4字节的长度拷贝,提升拷贝效率

void *memset4(void *src, int c, size_t n)
{
	char *tmpsrc;
	int tmp;
	
	if (src == NULL)
	  return NULL;
	
	tmpsrc = (char*)src;
	
	//判断源地址是否按4字节对齐,二进制位最后两位是否为0
	if ((unsigned long)tmpsrc & 0x3){
		while (n--)
			*tmpsrc++ = (char) c;
	}
	else {
		size_t wordnum;
		size_t slice;
		
		wordnum = n/sizeof(int);
		slice = n % (sizeof(int));
		
		c = c&0xff;//取低8位
		tmp = c + (c << 8) + (c << 16) + (c << 24);
		while (wordnum--){
			*(int *)tmpsrc = tmp;
			tmpsrc += 4;
		}
		
		while (slice--)
			*tmpsrc++ = (char) c;
	}
	
	return src;
}

void *memcpy4(void *dest, const void *src, size_t n)  
{  
	char *p_dest, *p_src;

	if ((dest == NULL) || (src == NULL))
		return NULL;
		
	p_dest = (char *)dest;
	p_src = (char *)src;
	
	//判断源地址和目的地址是否按4字节对齐,若对齐则一次拷贝4个字节
	if (((unsigned long)p_dest & 0x3) || ((unsigned long)p_src & 0x3)){
		while(n--)
			*p_dest++ = *p_src++;
	}
	else {
		size_t wordnum;
		size_t slice;
		wordnum = n/sizeof(int);
		slice = n % (sizeof(int));
		
		while (wordnum--){
			*(int *)p_dest = *(int *)p_src;
			p_dest += 4;
			p_src += 4;
		}
		while (slice--)
			*p_dest++ = *p_src++;
	}
		
	return dest;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
memset函数memcpy函数是C/C++标准库中的两个函数,用于对内存进行操作。 1. memset函数: - 函数原型:`void* memset(void* dest, int value, size_t n);` - 功能:将一块内存设置为指定的值。 - 参数: - `dest`:要设置的内存块的起始地址。 - `value`:要设置的值,通常是一个无符号字符。 - `n`:要设置的字节数。 - 返回值:指向目标内存块的指针。 - 示例: ```cpp unsigned char AIdataGram[111]; memset(AIdataGram, 0, 111 * sizeof(unsigned char)); ``` - 上述示例使用memset函数将AIdataGram数组中的所有元素设置为0,以实现数组的初始化。 2. memcpy函数: - 函数原型:`void* memcpy(void* dest, const void* src, size_t n);` - 功能:将源内存块的内容复制到目标内存块。 - 参数: - `dest`:目标内存块的起始地址,即数据将被拷贝到的位置。 - `src`:源内存块的起始地址,即数据将被拷贝的位置。 - `n`:要拷贝的字节数。 - 返回值:指向目标内存块的指针。 - 示例: ```cpp char src[] = "Hello"; char dest[10]; memcpy(dest, src, strlen(src) + 1); ``` - 上述示例使用memcpy函数将源数组src中的内容复制到目标数组dest中。注意要确保目标数组有足够的空间来存储源数组的内容。 总结:memset函数用于设置内存块的值,而memcpy函数用于复制内存块的内容。它们都是在处理内存操作时常用的函数,能够提供高效的内存操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值