实现memcpymemcpy的优化memmovememsetstrcpystrncpy

Posted wanglelelihuanhuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现memcpymemcpy的优化memmovememsetstrcpystrncpy相关的知识,希望对你有一定的参考价值。

memcpy

函数原型:

函数功能:memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。函数返回值指向dest的指针。不考虑内存重叠

#include<stdio.h>
#include<assert.h>
#include<string.h>
void* Memcpy(void* dst, const void* src, size_t size)

	assert(dst);
	assert(src);
	char* pdst = (char*)dst;
	const char* psrc = (const char*)src;
	
	while (size--)
	
		*pdst++ = *psrc++;
	
	
	return dst;

int main()

	char dst[20];
	memset(dst, '\\0', sizeof(dst));
	char src[] = "hello";
	printf("%s\\n", Memcpy(dst, src, strlen(src)));
	return 0;

memcpy函数的优化

#include<stdio.h>
#include<assert.h>
#include<string.h>
void* Memcpy(void* dst, const void* src, size_t size)

	int len = size / 4; //计算size要拷的次数
	int mod = size % 4;//计算余下的字符要拷的次数
	int* pdst = (int *)dst;//强转为int,这样一次性可以拷4个字节
	const int* psrc = (const int*)src;
	//没有余下字符就返回dst,结束拷贝
	if (mod == 0)
	
		return dst;
	
	while (len--)
	
		*pdst++ = *psrc++;
	
	char* p = (char*)dst;
	p += len*sizeof(int);//指向余下的字符
	const char* q = (const char*)src;
	q += len*sizeof(int);
	while (mod--)
	
		*p++ = *q++;
	
	return dst;

int main()

	char dst[20];
	memset(dst, '\\0', sizeof(dst));
	const char* src = "hello";
	printf("%s\\n", Memcpy(dst, src, strlen(src)));
	return 0;


 

memmove
函数原型:

函数功能:memmove用于从src拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。

#include<stdio.h>
#include<assert.h>
#include<string.h>
void* Memmove(void* dst, const void* src, size_t size)

	assert(dst);
	assert(src);
	char* pdst = (char*)dst;
	const char* psrc = (const char*)src;
	if (pdst > psrc + size || pdst < psrc)
	
		while (size--)
		
			*pdst++ = *psrc++;
		
	
	else
	
	    pdst = pdst + size-1;
		psrc = psrc + size-1;
		while (size--)
		
			*pdst-- = *psrc--;
		
	
	return dst;

int main()

	char dst[20];
	memset(dst, '\\0', sizeof(dst));
	char src[] = "hello";
	printf("%s\\n", Memmove(dst, src, strlen(src)));
	return 0;

memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中。

但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开销。

memmove的处理措施:

(1)当源内存的首地址大于目标内存的首地址时,实行正向拷贝

(2)当源内存的首地址小于目标内存的首地址时,实行反向拷贝

memset
函数原型:

函数功能:将s所指向的某一块内存中的前n个 字节的内容全部设置为ch指定的ASCII值, 第一个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向s的指针。

#include<stdio.h>
#include<assert.h>
void* Memset(void* str, char c, size_t size)

	assert(str);
	char* s = (char*)str;
	while (size--)
	
		*s++ = c;
	
	return str;

int main()

	char s[] = "hello world";
	printf("%s\\n", s);
	Memset(s, '0', strlen(s));
	printf("%s\\n", s);
	return 0;

strcpy  strncpy

函数原型:

函数功能:strcpy把从src地址开始且含有'\\0'结束符的字符串复制到以dest开始的地址空间。返回指向dest的指针。src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。

strncpy把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中,并返回dest。

#include<stdio.h>
#include<assert.h>
#include<string.h>
char* Strcpy(char* dst,const char*src)

	assert(dst);
	assert(src);
	char* pdst = dst;
	while (*src)
	
		*dst++ = *src++;
	
	return pdst;

int main()

	const char src[] = "hello,hello bit";
	char dst[] = "";
	printf("%s\\n", Strcpy(src, dst));
	return 0;

strcpy和memcpy主要有以下3方面的区别。 1、复制的内容不同。 strcpy只能复制 字符串,而memcpy可以复制任意内容,例如 字符数组、整型、 结构体、类等。 2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。 3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy

 

#include<stdio.h>
#include<assert.h>
char* Strncpy(char* dst, const char* src, size_t size)

	assert(dst);
	assert(src);
	char* pdst = dst;
	while (size--)
	
		*dst++ = *src++;
	
	return pdst;

int main()

	char dst[20];
	memset(dst, '\\0', sizeof(dst));
	const char* src = "hello";
	printf("%s\\n", Strncpy(dst, src, strlen(src)));
	return 0;


 

strcpy和memcpy主要有以下3方面的区别。 1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。 2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。 3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy。

 

以上是关于实现memcpymemcpy的优化memmovememsetstrcpystrncpy的主要内容,如果未能解决你的问题,请参考以下文章

memcpy和strcpy的区别

梦开始的地方 —— C语言内存函数memcpy-memmove-memset(使用+模拟实现)

C语言篇 + 字符串处理函数和内存函数的介绍及模拟实现(避开你的语法坑,请注意查收)

doublefloat等多字节数据处理

memcpy和strcpy的区别

实现Strcpy函数 - 通过函数发现 “程序之美” | 不断优化优化再优化~