C++ memcpy、memmove
函数原型:
void *memcpy(void *dest, const void* src, size_t count );
void *memmove(void *dest, const void* src, size_t count );
memcpy和memmove相同点:
- 都是用于从src拷贝count个字节到dest
 
memcpy和memmove区别:
如果目标区域和源区域有重叠的话:
- memcpy不能够确保源串所在重叠区域在拷贝之前被覆盖。
 - memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后src内容会被更改,当目标区域与源区域没有重叠则和memcpy函数功能相同。
 
但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开销。
Linux下的实现过程:
void* _cdec1 memcpy(void* dst, const void* src, size_t count) {
	void *ret = dst;
    // 注意, memcpy函数没有处理dst和src区域是否重叠的问题
    while (count--) {
	*(char *)dst = *(char *)src;
        dst = (char *)dst + 1;
        src = (char *)src + 1;
    }
    return (ret);
}
void _cdec memmove(void* dst, const void* src, size_t count) {
    void* ret = dst;
    if (dst <= src || (char *)dst >= ((char *)src + count)) {
        // 若dst和src区域没有重叠,则从起始处开始逐一拷贝
        while (count--) {
            *(char *)dst = *(char *)src;
            dst = (char *)dst + 1;
            src = (char *)src + 1;
        }
    }
    else {
        // 若dst和src 区域交叉,则从尾部开始向起始位置拷贝,这样可以避免数据冲突
        dst = (char *)dst + count - 1;
        src = (char *)src + count - 1;
        while (count--) {
            *(char *)dst = *(char *)src;
            dst = (char *)dst + 1;
            src = (char *)src + 1;
        }
    }
    return (ret);
}
												
											C++ memcpy、memmove的更多相关文章
- memcpy、memmove、memset及strcpy函数实现和理解
		
memcpy.memmove.memset及strcpy函数实现和理解 关于memcpy memcpy是C和C++ 中的内存拷贝函数,在C中所需的头文件是#include<string.h> ...
 - strcpy()、memcpy()、memmove()、memset()的内部实现
		
一直想知道 strcpy().memcpy().memmove().memset()的内部实现 strcpy(), 字符串拷贝. char *strcpy(char *strDest, const c ...
 - memcpy、memmove、memset、memchr、memcmp、strstr详解
		
第一部分 综述 memcpy.memmove.memset.memchr.memcmp都是C语言中的库函数,在头文件string.h中.memcpy和memmove的作用是拷贝一定长度的内存的内容,m ...
 - 不使用库函数、自己编写的(strlen、strcpy、strcmp、strcat、memcmp、memcpy、memmove)
		
不使用库函数.自己编写的(strlen.strcpy.strcmp.strcat.memcmp.memcpy.memmove) //求字符串长度的函数 int my_strlen(const char ...
 - [整理]内存重叠之memcpy、memmove
		
函数原型: void *memcpy( void *dest, const void *src, size_t count ); void *memmove( void* dest, const vo ...
 - c语言中几个常见的库函数strlen、strcmp、strcat、strcpy、strncpy、memset、memcpy、memmove、mmap
		
1.strlen() 1)计算给定字符串的长度,不包括’\0’在内 unsigned int strlen(const char *s) { assert(NULL != s);//如果条件不满足,则 ...
 - memcpy、memmove、memset
		
void * memcpy(void * dst, const void * src, size_t count) { void *res=dst; while (count--) { *(char* ...
 - memcpy与memmove的区别
		
在面试中经常会被问道memcpy与memove有什么区别? 整理如下: 其实主要在考C的关键字:restrict C库中有两个函数可以从一个位置把字节复制到另一个位置.在C99标准下,它们的原型如下: ...
 - 【VS开发】【C/C++开发】memcpy和memmove的区别
		
memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下: void *memcpy(void *dst, const void ...
 - memmove、memcpy、strcpy、memset的实现
		
memmove.memcpy.strcpy.memset 原型为: void *memmove( void* dest, const void* src, size_t count ); char* ...
 
随机推荐
- TPCH-PostgreSQL生成数据集并导入数据表
			
1.数据集下载 TPC-H数据集: https://github.com/gregrahn/tpch-kit 2.解压安装 unzip tpch-kit-master.zip cd tpch-kit ...
 - 扯淡的DevOps,我们开发根本不想做运维!
			
引言 最初考虑引用" DevOps 已死,平台工程才是未来"作为标题,但这样的表达可能太过于绝对.最终,决定用了"扯淡的"这个词来描述 DevOps,但这并不是 ...
 - NC201985 立方数
			
题目链接 题目 题目描述 对于给定的正整数 N,求最大的正整数 A,使得存在正整数 B,满足 \(A^3B=N\) 输入包含 T 组数据,1≤T≤10,000:\(1≤N≤10^{18}\) 输入描述 ...
 - ARM指针寄存器——堆栈指针寄存器SP、程序计数器PC、连接寄存器LR详解
			
堆栈的实现方法 在随机存储器区划出一块区域作为堆栈区,数据可以一个个顺序地存入(压入)到这个区域之中,这个过程称为'压栈'(push ).通常用一个指针(堆栈指针 SP-StackPointer ...
 - Ubuntu18.04 Server部署Flannel网络的Kubernetes
			
准备服务器 ESXi6.5安装Ubuntu18.04 Server, 使用三台主机, 计划使用hostname为 kube01, kube02, kube03, 配置为2核4G/160G, K8s要求 ...
 - StretchDIBits在一些图像尺寸下失败
			
StretchDIBits用来打印图像,但是由于某种未知的原因,当图像达到特定尺寸时,它会失败. 图像数据从其他一些图像源以24位BGR格式加载到无符号int数组中.它可以在某些大小下工作,但根本无法 ...
 - win32-封装BeginPaint
			
Graphics* StartPaint(HWND win, HDC* hdc, PAINTSTRUCT* ps) { *hdc = BeginPaint(win, ps); return new G ...
 - xcode真机运行包添加(更新到15.4)
			
今天给真机装包,提示xcode版本低不能安装,电脑内存有些不足,xcode更新不了,这时候了解到xcode可以单独添加开发包\(^o^)/~ 1.下载 链接: https://pan.baidu.co ...
 - 进程,join的使用,守护进程---day30
			
1.进程 # ### 进程 import os,time #当前进程id(子进程) res = os.getpid() print(res) #1772 #当前进程id(父进程) res = os.g ...
 - ContentType组件表使用
			
https://www.shuzhiduo.com/A/qVdepN2r5P/