内存函数:学习笔记7

news2024/11/24 3:39:35

目录

一.前言

二. memcpy模拟实现

三. memmove模拟实现

四.memcmp模拟实现


一.前言

计算机内存的实质就是以字节为编号单元的二进制序列集合,操作内存时我们应具有这样的视角。 

二. memcpy模拟实现

库函数memcpy函数首部:void *memcpy( void *dest, const void *src, size_t num );

函数的功能是将src(数据源)指向的内存空间中的前num个字节的二进制序列拷贝到dest(目的空间)指向的前num个字节的内存空间中。拷贝完成后,函数会返回目的空间的首地址。


void*类型的指针变量可以用于接收任何类型的地址。

void*类型的指针不能直接解引用,也不能直接进行运算(只能进行赋值,但不能自增或自减).若要对void*类型指针进行解引用或运算,必须对其进行强制类型转换,由于内存是以1个字节为单位的,所以大多数情况下我们一般将其强制转换为char*的指针后进行解引用和运算

(char*指针的访问权限和运算单位恰好为一个字节,符合我们进行内存操作的要求)

模拟实现:

void* my_memcpy( void* dest, const void* src, size_t num)
{
	assert(dest && src);
	if (dest == src)
	{
		return dest;
	}
	void* ret = dest;
	while (num--)
	{
		*((char*)dest) = *((char*)src);
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;
}

三. memmove模拟实现

当拷贝的目的内存空间和数据源空间有重叠部分时,若调用上面的memcpy函数在如下情况中就会出现问题。(假设我们要拷贝20个字节(num=20)的数据内容(vs2022一个整形四个字节))

很显然重叠部分的数据会丢失。

由此C标准库给出了memmove函数。

 memmove函数首部:void *memmove( void *dest, const void *src, size_t num );

函数的功能描述与memcpy基本相同,但多了一句话“If some regions of the source area and the destination overlap, memmove ensures that the original source bytes in the overlapping region are copied before being overwritten”意思是当数据源内存空间与拷贝目的空间有重叠部分时,函数可以保证重叠部分数据在被覆盖前完成拷贝。

为了实现当dest指向空间和src指向空间有重叠部分时的数据的拷贝,memmove在设计时需分以下两种情况讨论:

显然区分上述两种情况的条件是指针src和dest的大小关系。

当src<dest,进行拷贝操作时我们需要从数据源空间的前num个字节的最后一个字节(从后向前)开始逐个字节拷贝到目标空间的前num个字节的相应空间中

当src>dest,进行拷贝操作时我们需要从数据源空间的前num个字节的第一个字节(从前向后)开始逐个字节拷贝到目标空间的前num个字节的相应空间中。

需要注意的是,当dest指向空间和src指向空间无重叠部分时,上述两种拷贝顺序都是可以使用的。

memmove模拟实现:

void* my_memmove(void* dest, void* src, size_t num)
{
	assert(dest && src);
	if (dest == src)
	{
		return dest;
	}
	void* ret = dest;

	if (dest > src)             //从src空间的最后一个字节开始拷贝到dest空间的前num个字节中
	{
		while (num--)
		{
			*((char*)dest + num) = *((char*)src + num);
		}
		return ret;
	}
	else                        //从src空间的第一个字节开始拷贝到dest空间的前num个字节中
	{
		while (num--)
		{
			*((char*)dest) = *((char*)src);
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
		return ret;
	}
}

四.memcmp模拟实现

memcmp函数首部:int memcmp( const void *buf1, const void *buf2, size_t num );

函数功能是,将buf1指向的内存空间中前num个字节的二进制序列与buf2指向的内存空间中前num个字节的内容进行比较。

memcmp函数模拟实现:

int my_memcmp(const void* arr1, const void* arr2,size_t num)
{
	assert(arr1 && arr2);
	while (num && *(char*)arr1 == *(char*)arr2)
	{
		arr1 = (char*)arr1 + 1;
		arr2 = (char*)arr2 + 1;
		num--;
	}
	if (num)
	{
		return *(unsigned char*)arr1 - *(unsigned char*)arr2;
	}
	else
	{
		return 0;
	}
}

注意一个细节:返回值中的强制转换类型为unsigned char*。这里不用char*的原因如下:

比如我们比较的是两个空间的4个字节的内容,两块空间中分别存放了一个整形数据,arr1中存放的整形为128,arr2中存放的整形为1,(假设机器为小端机器),在比较arr1和arr2首字节序(前八个二进制位时)如果函数返回值写成return *(char*)arr1 - *(char*)arr2;*(char*)arr1会被认为是负数(整形128的前八位二进制序列为10000000截断后作为有符号char代表-128),这时函数返回值就是一个负数,与我们预期的结果不同,返回值中的强制转换类型为unsigned char就不会出现类似的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/151236.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

量子计算机“九章”

1.中国量子计算机“九章”实现量子霸权 2020年12月&#xff0c;中国科学技术大学宣布该校成功构建光子量子计算原型机“九章”。“九章”是中国科学技术大学潘建伟团队、中科院上海微系统所和国家并行计算机工程技术研究中心合作完成。“九章”的名字是来源于中国历史上最重要…

算法设计与分析-分支限界法习题

7-1 布线问题印刷电路板将布线区域划分成 nm 个方格阵列&#xff0c;要求确定连接方格阵列中的方格a 点到方格b 的最短布线方案。在布线时&#xff0c;电路只能沿直线布线&#xff0c;为了避免线路相交&#xff0c;已布了线的方格做了封锁标记&#xff0c;其他线路不允许穿过被…

大数据开发之利剑 -- TDengine

前言 在大数据技术全球爆炸的时代&#xff0c;以及大数据在各行各业的实际应用&#xff0c;大数据的快速发展就像计算机和互联网一样&#xff0c;很可能成为新一轮的技术革命。数据处理、机器学习、AI等新兴技术诞生&#xff0c;会改变数据世界的许多算法和理论基础&#xff0c…

DAY-1 | Java数据结构之链表:删除无头单链表中等于给定值 val 的所有节点

目录 一、题干 &#x1f517;力扣203. 移除链表元素 二、题解 1、思路 2、完整代码 一、题干 &#x1f517;力扣203. 移除链表元素 二、题解 1、思路 题干的意思是&#xff0c;要删除链表中所有指定的元素。最暴力的方法是&#xff0c;依次遍历链表中的各个节点&#x…

Day3 XML方式的Spring应用

全文总结基于XML配置1、学习了bean标签&#xff0c;2、三种配置bean的方式&#xff1a;1、静态工厂&#xff1b;2、实例工厂和3、自定义实现factorybean1 SpringBean 的配置类inin-method 与构造方法不同&#xff0c;构造方法是创建对象的&#xff0c;等对象创建以后使用inin-m…

2023年全国最新消防设施操作员精选真题及答案

百分百题库提供消防设施操作员考试试题、消防设施操作员考试预测题、消防设施操作员考试真题、消防设施操作员证考试题库等,提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 1、对外观目测判断,下列哪种情况不应报废?(  ) A、铭牌标志脱落 B、瓶…

pyqt5加载matplotlib图形

matplotlib的图形处理非常强大。今天花了很长时间才将matplotlib图形嵌入到pyqt5中。在这里记录一下&#xff0c;便于以后查寻。有些可能还理解不到位。开始要导入几个模块&#xff1a;from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvasFigur…

tomcat下载和配置(简单,详细)

下载 官网&#xff1a;http://tomcat.apache.org/ 找到需要的版本&#xff0c;点击download 在download页面&#xff0c;选择需要下载的。&#xff08;分为压缩版和安装版&#xff0c;我比较推荐压缩版&#xff0c;省事解压缩就好&#xff09; 配置 首先&#xff01;&…

[ 数据结构 ] 集合覆盖问题(贪心算法)

0 集合覆盖问题 假设存在如下表的需要付费的广播台&#xff0c;以及广播台信号可以覆盖的地区。 如何选择最少的广播台&#xff0c;让所有的地区都可以接收到信号 广播台覆盖地区K1北京,上海,天津K2广州,北京,深圳K3成都,上海,杭州K4上海,天津K5杭州,大连 思路分析①:穷举法,…

LeetCode 64 最小路径和 | 解题思路分享

原题链接&#xff1a;64. 最小路径和 题目难度&#xff1a;中等 题目描述 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 **说明&#xff1a;**每次只能向下或者向右移动一步。 示例 1&…

Apache Spark + 海豚调度:PB 级数据调度挑战,教你如何构建高效离线工作流

2010年&#xff0c;我国进入移动互联网&#xff0c;数据规模成几何式增长。在大数据开源技术领域&#xff0c;以Hadoop为核心的大数据生态系统面对海量数据也不断发展与迭代&#xff0c;大数据处理流程中的各个开源组件&#xff0c;也一起开启了狂飙突进的大数据时代&#xff0…

MyBatis---初入

MyBatis快速入门 文章目录MyBatis快速入门MyBatisMyBatis开发步骤添加MyBatis的坐标创建user数据表编写user实体类编写映射文件UserMapper.xml编写核心文件SqlMapConfig.xml编写测试类MyBatis Mybatis是一个优秀的基于java的持久层框架&#xff0c;它内部封装了jdbc,使开发者只…

疫情放开后,如何保护居家员工的办公安全?

随着疫情的放开&#xff0c;大多数企业的员工因“阳”不得不在家办公。据当前的趋势来看&#xff0c;一线城市的大小企业已经出现高比例的员工感染&#xff0c;不少工作人员或出于安全的考虑选择居家办公。但无论是被迫居家隔离&#xff0c;还是主动远程办公&#xff0c;大多数…

Redis缓存何以一枝独秀?——从百变应用场景与热门面试题中感受下Redis的核心特性与使用注意点

大家好&#xff0c;又见面了。 本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容&#xff0c;将会通过系列专题&#xff0c;讲清楚缓存的方方面面。如果感兴趣&#xff0c;欢迎关注以获取后续更新。 作为《深入理解缓存原理与实战设计》系列专栏&#xff0c;在…

国产高清卫星影像时代来了,打造中国版“谷歌地球”!

随着国家数字化战略转型进程不断加快&#xff0c;卫星遥感影像作为基础数据&#xff0c;应用越来越广泛。目前已经成为资源环境调查、监测、评价和管理等不可或缺的技术手段。 不止于此&#xff0c;在推动行业发展、提高生产力以及节约成本等方面&#xff0c;卫星遥感影像都实…

【半监督医学图像分割 2022 CVPR】S4CVnet 论文翻译

【半监督医学图像分割 2022 CVPR】S4CVnet论文翻译 论文题目&#xff1a;When CNN Meet with ViT: Towards Semi-Supervised Learning for Multi-Class Medical Image Semantic Segmentation 中文题目&#xff1a;当CNN与ViT相遇:面向多类医学图像语义分割的半监督学习 论文链接…

kotlin必备基础一

kotlin 必备基础方法的声明成员方法类方法&#xff08;静态方法&#xff09;单表达式方法局部方法方法高级特性高阶函数函数作为参数函数作为返回值闭包&#xff08;Cloure&#xff09;闭包的特性闭包的好处解构申明匿名方法kotlin 方法字面值方法参数默认参数可变数量参数Lamb…

【机器学习】K近邻算法(K-NearestNeighbors , KNN)详解 + Java代码实现

文章目录一、KNN 基本介绍二、KNN 核心思想三、KNN 算法流程四、KNN 优缺点五、Java 代码实现 KNN六、KNN 改进策略一、KNN 基本介绍 邻近算法&#xff0c;或者说K最邻近&#xff08;KNN&#xff0c;K-NearestNeighbors&#xff09;分类算法是分类方法中最简单的方法之一。所谓…

Cadence PCB仿真使用Allegro PCB SI为分立元件创建统一的模型并赋值方法图文教程

⏪《上一篇》   🏡《总目录》   ⏩《下一篇》 目录 1,概述2,配置方法3,总结1,概述 本文简单介绍使用Allegro PCB SI软件配置电压地网络电压的方法。 2,配置方法 第1步:打开待仿真的PCB文件,并确认软件为Allegro PCB SI 如果,打开软件不是Allegro PCB SI则可这样…

[ 数据结构 ] 背包问题(动态规划)

0 背包问题 有一个背包,容量为4磅,现有如下物品 物品重量价格吉他(G)11500音响(S)43000电脑(L)32000 1)要求达到的目标为装入的背包的总价值最大&#xff0c;并且重量不超出 2)要求装入的物品不能重复(01背包) 1 动态规划 动态规划(Dynamic Programming)算法的核心思想是&…