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的区域!
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>
这个头中,但区别很大:
\0
为止(include),一不留神就会写越界。\0
,就没有了。这个接口稍微安全一点点。本文链接:https://cs.pynote.net/sf/c/202112214/
-- EOF --
-- MORE --