当前位置: 首页 > news >正文

C语言自己实现一个memcpy函数

目录

  • 按字节拷贝实现memcpy
  • 按4字节拷贝实现memcpy
  • Tips

在 C 语言中,我们可以自己实现 memcpy 函数来实现内存数据的拷贝操作。memcpy 函数用于将指定长度的数据从源地址复制到目标地址。

按字节拷贝实现memcpy

#include <stdio.h>void* my_memcpy_byte(void* dst, const void* src, int n)
{if (dst == NULL || src == NULL || n <= 0)return NULL;char* pdst = (char*)dst;char* psrc = (char*)src;//判断目标内存区域和源内存区域是否有重叠if (pdst > psrc && pdst < psrc + n) {//如果有重叠,就从尾部开始遍历pdst = pdst + n - 1;psrc = psrc + n - 1;while (n--)*pdst-- = *psrc--;}else{while (n--)*pdst++ = *psrc++;}return dst;
}int main(void)
{char str[] = "HelloWorld";char* str1 = &str[0];char* str2 = &str[1];my_memcpy_byte(str1, str2, 5);printf("%s\n", str); //输出elloWWorldreturn 0;
}

按4字节拷贝实现memcpy


#include <stdio.h>void* my_memcpy_byte(void* dst, const void* src, int n)
{if (dst == NULL || src == NULL || n <= 0)return NULL;int* pdst = (int*)dst;int* psrc = (int*)src;char* pdstTemp = NULL;char* psrcTemp = NULL;int byte4Count = n / 4; //有多少个4字节,按4字节拷贝int byteCount = n % 4; //剩余字节数按字节拷贝//判断目标内存区域和源内存区域是否有重叠,如果有从后往前,如果没有从前往后if (pdst > psrc && pdst < (char*)psrc + n){pdstTemp = (char*)pdst + n - 1;psrcTemp = (char*)psrc + n - 1;while (byteCount--){*pdstTemp-- = *psrcTemp--;}pdstTemp++;psrcTemp++;pdst = (int*)pdstTemp;psrc = (int*)psrcTemp;pdst--;psrc--;while (byte4Count--){*pdst-- = *psrc--;}}else{while (byte4Count--){*pdst++ = *psrc++;}pdstTemp = (char*)pdst;psrcTemp = (char*)psrc;while (byteCount--){*pdstTemp++ = *psrcTemp++;}}return dst;
}int main(void)
{char str[] = "HelloWorld";char* str1 = &str[0];char* str2 = &str[1];my_memcpy_byte(str1, str2, 1);printf("%s\n", str);return 0;
}

Tips

对比字节拷贝,4字节拷贝速度是提高不少。
但是需要注意,void *dst, const void *src这两个参数是需要按4字节对齐的,如果本身不是4字节对齐,按4字节拷贝效率也会变低。

相关文章:

C语言自己实现一个memcpy函数

目录 按字节拷贝实现memcpy按4字节拷贝实现memcpyTips 在 C 语言中&#xff0c;我们可以自己实现 memcpy 函数来实现内存数据的拷贝操作。memcpy 函数用于将指定长度的数据从源地址复制到目标地址。 按字节拷贝实现memcpy #include <stdio.h>void* my_memcpy_byte(void*…...

C#教师考勤管理系统asp.net+sqlserver

3.3.1 员工部分 1&#xff1a;请假管理&#xff1a;包括填写请假条&#xff0c;提交申请&#xff0c;查看审批&#xff0c;审核请假等等。 2&#xff1a;考勤管理&#xff1a;针对具体的员工考勤的统计等管理。 3&#xff1a;个人资料管理&#xff1a;进行个人信息管理&#xf…...

Nginx代理配置详解

一、什么是代理 1、正向代理(forward proxy) 正向代理&#xff0c;简单的说就像是一个跳板&#xff0c;它隐藏了真实的请求客户端&#xff08;IP&#xff09;&#xff0c;服务端不知道真实的客户端是谁&#xff0c;客户端请求的服务都由代理服务器来代替请求。 举个例子来说…...

DAG 的深度优先搜索标记

/**\ | DAG 的深度优先搜索标记 | INIT: edge[][] 邻接矩阵 ; pre[], post[], tag 全置 0; | CALL: dfstag(i, n); pre/post: 开始 / 结束时间 \**/ int edge[V][V], pre[V], post[V], tag; void dfstag( int cur, int n) { // vertex: 0 ~ n-1 pre[cur] tag; for…...

网络存储解决方案:选择与配置

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…...

java中BigDecimal除法运算指定小数点保留位数和取舍规则

java中使用BigDecimal进行相除运算时&#xff0c;为了避免抛出ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result。最好指定小数点保留位数和取舍规则。 取舍规则 ROUND_CEILING: 舍位时向正无穷方向取值。即&#xff1a;向上取…...

车联网远程监控管理提升车辆调度效率,实现高效运营

随着智慧城市建设与物联网技术发展&#xff0c;车辆使用4G工业路由器网络实现车联网&#xff0c;并对车上视频监控、GPS定位以及温湿度传感器等信息进行数据采集和实时传输。这些数据的采集和监测将通过4G网络上传到管理平台&#xff0c;为车辆调度和运行效率的优化提供了有力的…...

数据治理-数据建模和设计

定义 发现、分析和确定数据需求的过程&#xff0c;用一种称为数据模型的精确形式表示和传递这些数据需求。过程是循环迭代的&#xff0c;可能包括概念、逻辑和物理模型。 常见的6种数据模型 关系模式、多维模式、面向对象模式、事实模式、时间序列模式、NoSQL模式。根据描述详…...

博客系统(升级(Spring))(四)(完)基本功能(阅读,修改,添加,删除文章)(附带项目)

博客系统 (三&#xff09; 博客系统博客主页前端后端个人博客前端后端显示个人文章删除文章 修改文章前端后端提取文章修改文章 显示正文内容前端后端文章阅读量功能 添加文章前端后端 如何使用Redis项目地点&#xff1a; 博客系统 博客系统是干什么的&#xff1f; CSDN就是一…...

常用的辅助类(必会)

1.CountDownLatch package com.kuang.add;import java.util.concurrent.CountDownLatch;//计数器 减法 public class CountDownLatchDemo {public static void main(String[] args) throws InterruptedException {//总数是6&#xff0c;必须要执行任务的时候&#xff0c;再使用…...

Java常用类之 String、StringBuffer、StringBuilder

Java常用类 文章目录 一、字符串相关的类1.1、String的 不可变性1.2、String不同实例化方式的对比1.3、String不同拼接操作的对比1.4、String的常用方法1.5、String类与其他结构之间的转换1.5.1、String 与基本数据类型、包装类之间的转换1.5.2、String 与char[]的转换1.5.3、…...

linux在所有文件中查找某一个字符串

linux在所有文件中查找某一个字符串 有时候我们需要在大量文件中查找某一个字符串&#xff0c;手工一个一个打开文件查找非常耗时&#xff0c;我们可以使用 find 和 xargs 两个命令来实现查找指定字符串。 命令详解 find <directory> -type f -name "*.c" |…...

WebSocket vs SSE: 实时数据推送到前端的选择与实现(详细)

Websocket和Server-Sent Events 对比推送数据给前端及各自的实现 二者对比WebSocket&#xff1a;Server-Sent Events (SSE)&#xff1a;选择 WebSocket 还是 SSE&#xff1a; Websocket 实现使用原生 WebSocket API&#xff1a;使用 Netty 创建 WebSocket&#xff1a;总结和选择…...

Redis从入门到精通(二:数据类型)

数据存储类型介绍 Redis 数据类型&#xff08;5种常用&#xff09; string hash list set sorted_set/zset&#xff08;应用性较低&#xff09; redis 数据存储格式 redis 自身是一个 Map&#xff0c;其中所有的数据都是采用 key : value 的形式存储 数据类型指的是存储的数据…...

基于SSM的珠宝首饰交易平台

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…...

4款视频号数据分析平台!

很多人在做视频号的时候就会有创作参考的需求&#xff0c;那么你们知道视频号中有哪些数据平台&#xff1f;今天就和大家来分享一下 接下来就总结一下视频号数据平台有哪些&#xff1f;排名不分前后。 1&#xff1a;视频号助手&#xff08;channels.weixin.qq.com&#xff09…...

【系统架构】什么是集群?为什么要使用集群架构?

什么是集群&#xff1f;为什么要使用集群架构&#xff1f; 1.什么是集群&#xff1f;2.为什么要使用集群&#xff1f;2.1 高性能2.2 价格有效性2.3 可伸缩性2.4 高可用性2.5 透明性2.6 可管理性2.7 可编程性 3.集群的常见分类3.1 负载均衡集群3.2 高可用性集群3.3 高性能计算集…...

Java手写拓扑排序和拓扑排序应用拓展案例

Java手写拓扑排序和拓扑排序应用拓展案例 1. 算法思维导图 #mermaid-svg-o8KpEXzxukfDM8c9 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-o8KpEXzxukfDM8c9 .error-icon{fill:#552222;}#mermaid-svg-o8KpEXzxukfD…...

练习:使用servlet显示试卷页面

试卷页面代码 在浏览器输入如下地址&#xff1a; http://localhost/examPageServlet 效果如下&#xff1a;...

视频监控系统/视频云存储EasyCVR接入国标GB28181设备无法播放设备录像,是什么原因?

安防视频监控平台EasyCVR支持将部署在监控现场的前端设备进行统一集中接入&#xff0c;可兼容多协议、多类型设备&#xff0c;管理员可选择任意一路或多路视频实时观看&#xff0c;视频画面支持单画面、多画面显示&#xff0c;视频窗口数量有1、4、9、16个可选&#xff0c;还能…...

DownKyi终极指南:快速掌握B站视频批量下载与8K超高清获取技巧

DownKyi终极指南&#xff1a;快速掌握B站视频批量下载与8K超高清获取技巧 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等…...

零碳园区的能源供给成本主要包括哪些方面?

零碳园区的能源供给以“绿色低碳、协同高效”为核心&#xff0c;区别于传统园区以化石能源为主的供给模式&#xff0c;其成本构成更具多样性和综合性&#xff0c;涵盖“前期建设投入、中期运营消耗、后期维护补充”全生命周期&#xff0c;且与绿电布局、技术选型、政策导向密切…...

企业知识管理新方案:OpenCorpo开源项目部署与RAG架构实践

1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目&#xff0c;叫 OpenCorpo。这名字听起来有点“高大上”&#xff0c;但说白了&#xff0c;它就是一个帮你把公司内部那些零散、混乱的文档、知识、流程给“盘活”的工具。想象一下&#xff0c;你公司里是不是有无数个共享…...

计算机专业不想“敲代码”,都来冲这个行业

计算机专业不想“敲代码”&#xff0c;都来冲这个行业 在这个信息爆炸的时代&#xff0c;计算机专业作为热门选择之一&#xff0c;吸引了无数学子的目光。但与此同时&#xff0c;也有相当一部分同学心存疑虑&#xff1a;自己是计算机专业的&#xff0c;却对写代码提不起兴趣&a…...

一键安装器设计指南:从Shell脚本到自动化部署架构

1. 项目概述与核心价值最近在折腾一些自动化部署和脚本管理时&#xff0c;发现了一个挺有意思的项目&#xff1a;viomat7064/openclaw-installer。乍一看这个仓库名&#xff0c;你可能会联想到某种“爪子”工具&#xff0c;其实它本质上是一个针对特定开源软件或服务的一键式安…...

如何在5分钟内体验完整的Windows 12网页版:创新系统模拟器终极指南

如何在5分钟内体验完整的Windows 12网页版&#xff1a;创新系统模拟器终极指南 【免费下载链接】win12 Windows 12 网页版&#xff0c;在线体验 点击下面的链接在线体验 项目地址: https://gitcode.com/gh_mirrors/wi/win12 想要在浏览器中运行完整的Windows系统界面吗&…...

[特殊字符] 科普:论文查重的AI原理是什么?这个免费工具把“黑科技“讲明白了

同学们好&#xff0c;我是你们的论文写作科普博主。 今天不聊怎么选题&#xff0c;不聊怎么写文献综述&#xff0c;咱们来聊一个99%的同学都踩过坑的环节——查重。 先问大家一个问题&#xff1a;你知道查重到底是怎么查的吗&#xff1f; 很多同学以为查重就是"把你的文…...

本地部署9B代码智能体:基于vLLM与CoPaw-Flash的实践与深度评估

1. 项目概述&#xff1a;在本地部署与评估一个9B参数的代码智能体最近在折腾一个挺有意思的项目&#xff0c;尝试在单张NVIDIA H100 GPU上&#xff0c;部署并评估一个名为CoPaw-Flash-9B的本地代码智能体。这个模型基于Qwen3.5-9B微调而来&#xff0c;专门针对自主智能体任务进…...

086、Python数据压缩与归档:zipfile与tarfile实战笔记

086、Python数据压缩与归档:zipfile与tarfile实战笔记 一、从线上故障说起 上周排查一个生产环境问题:某服务每天生成的日志文件把磁盘撑满了。 查看代码发现,开发同事用 open().write() 直接写文本,一年下来积累了上千个文件。 其实这类场景最适合用压缩归档——既节省空…...

HI3861实战指南:基于MQTT协议实现OneNET平台设备双向通信

1. HI3861与OneNET平台双向通信实战 第一次接触HI3861开发板时&#xff0c;我就被它轻量级的物联网开发能力吸引了。这块板子虽然体积小&#xff0c;但配合OneNET平台能实现完整的物联网数据交互。今天我就用最直白的语言&#xff0c;分享如何让HI3861通过MQTT协议与OneNET平台…...