memcpy和memmove的异同

Last Updated: 2024-01-04 10:48:15 Thursday

-- TOC --

C代码中的内存拷贝,可以用memcpy,也可以用memmove,这两个函数有一个重要的区别,即不同的应用场景。

memcpy和memmove的定义如下:

// man memcpy
void *memcpy(void *restrict dest, const void *restrict src, size_t n);
// man memmove
void *memmove(void *dest, const void *src, size_t n);

都是从src拷贝n个byte到dest。

区别在于,src和dest在n的限定下,是否有overlap的区域!

mem_overlap

memcpy不能处理这种overlap,它定位速度,程序员如果能够确定src和dest没有overlap,用memcpy。(restrict修饰也说明了不能有overlap)

memmove可以很好的处理这种overlap,它定位安全,如果程序员不能确定是否有overlap,用memmove。

这两个函数都在<string.h>中定义。

memmove的实现方式,各版本可能不一样。有的使用临时内存,有的在判断src和dest是否有overlap,有或没有的处理方式会有差异。

memcpy的size可以是0

leetcode第4题,两个有序数组的中值,C语言版本,有的测试case,size就是0。

memcpy的效率

memcpy是一个效率很高的内存拷贝函数,它绝对不会做一个一个字节的内存拷贝,在地址不对齐的情况下,他是一个字节一个字节的拷,地址对齐以后,就至少会使用CPU字长来拷,32bit或64bit,甚至还会根据CPU的不同来选择使用一些优化指令(SIMD)来进行拷贝。总的来说,memcpy的实现是和CPU类型、操作系统、c库相关的。但同时需要认识到,memcpy的效率很高,但还不是最高,针对特定的CPU,我们可以写出一个比库中的memcpy更快的实现出来,但这需要很高的技巧。一般情况下,memcpy都足够快了!

memcpy与strcpy的区别

#include <string.h>
char *strcpy(char *restrict dest, const char *src);
char *strncpy(char *restrict dest, const char *restrict src, size_t n);

同在<string.h>这个头中,但区别很大:

本文链接:https://cs.pynote.net/sf/c/202112214/

-- EOF --

-- MORE --