Linux下的memcpy函数

article/2025/9/16 17:36:43

之前写过一篇关于 memcpy函数面试的文章

几个简单的笔试题

里面的代码使用的是char指针来实现,今天我们来看看Linux下面的memcpy

函数,它的实现上还是有一些巧妙的。

void * memcpy(void * dest, const void *src, size_t n)
{if (!(((unsigned long) dest ^ (unsigned long) src) & 7)) {__memcpy_aligned_up ((unsigned long) dest, (unsigned long) src,n);return dest;}__memcpy_unaligned_up ((unsigned long) dest, (unsigned long) src, n);return dest;
}

首先,函数会对参数判断地址是不是对齐的,如果是对齐的话,会调用对齐的内存拷贝函数,如果是不对齐的话,会调用不对其的函数。

正常情况下,地址都会是按4字节对齐的

看看__memcpy_aligned_up 函数

/** Hmm.. Strange. The __asm__ here is there to make gcc use an integer register* for the load-store. I don't know why, but it would seem that using a floating* point register for the move seems to slow things down (very small difference,* though).** Note the ordering to try to avoid load (and address generation) latencies.*/
static inline void __memcpy_aligned_up (unsigned long d, unsigned long s,long n)
{ALIGN_DEST_TO8_UP(d,s,n);n -= 8;while (n >= 0) {unsigned long tmp;__asm__("ldq %0,%1":"=r" (tmp):"m" (*(unsigned long *) s));n -= 8;s += 8;*(unsigned long *) d = tmp;d += 8;}n += 8;DO_REST_ALIGNED_UP(d,s,n);
}

我们直接看代码操作就很清楚了,是按照8个字节来做的偏移

我写了个测试程序,测试程序和内核代码有一些小出入,主要是我用的是devc++来写代码,unsigned long并不是8字节。

测试代码如下

#include <stdio.h>
#include <string.h>void * cris_memcpy(void *out, const void *in, unsigned int length) {if (!(((unsigned long) out ^ (unsigned long) in) & 7)) {printf("aligned\n");} if (out == NULL || in == NULL) {return NULL;}while (length) {*(char*)out++ = *(char*)in++;length = length - 1;}return out;
}typedef unsigned long long usize8_t;static inline void __memcpy_aligned_up (usize8_t d, usize8_t s,long n) {if (!(((usize8_t) d ^ (usize8_t) s) & 7)) {printf("aligned\n");} //n -= 8;printf("%d %d\n",n,sizeof(usize8_t));while (n >= 0) {usize8_t tmp;tmp = *(usize8_t *) s;n -= 8;s += 8;*(usize8_t *) d = tmp;d += 8;}n += 8;
}int main() {char a[20] = "happy new year";char b[20];char c[20];cris_memcpy(&b, &a, strlen(a));__memcpy_aligned_up(&c, &a, strlen(a));printf("a=%s\n",a);printf("b=%s\n",b);printf("c=%s\n",c);return 0;
}

代码输出

0364e1f9cc4945fae97549b03db774c6.png


5a18ee0218a16bef4f6e39461fbe377e.png

最后,如果觉得不错,大家顺手点个赞,转发就是对我最大的鼓励和支持!

1855b75e97b4e92c1587458324989b5c.png

长按识别二维码关注公众号


http://chatgpt.dhexx.cn/article/UGFMmtsT.shtml

相关文章

内存操作函数:memcpy函数,memove函数

目录: 1.memcpy函数(内存拷贝)(1)memcpy函数的说明(2)memcpy的使用a.代码b.结果 (3)memcpy的模拟实现a.代码b.结果 2.memmove函数(1)memmove函数的说明(2)内存重叠问题a.分析b.代码说明 (3)内存重叠问题的解决分析(4)memmove的使用(5)模拟实现memmove 1.memcpy函数(内存拷贝) …

memcpy函数和memmove函数

memcpy函数和memmove函数 本篇博客只要涉及到memcpy函数与memmove函数的使用和模拟 文章目录 memcpy函数和memmove函数一、memcpy函数1.1函数的定义1.2memcpy函数使用1.3memcpy函数模拟实现 二、memmove函数2.1memmove函数定义2.2memmove模拟思路 总结 一、memcpy函数 1.1函数…

memcpy函数底层实现

memcpy函数底层源码实现 destin目标地址&#xff0c;source为源内存地址&#xff0c;n为拷贝的字节数 void *memcpy(void *destin, void *source, unsigned n);在实现memcpy的时候注意源地址和目的地址是否重叠&#xff0c;当源地址的尾部与目的地址头部重叠时&#xff0c;要…

memcpy函数及模拟

1memcpy函数的参数和返回值 1.1参数 目的地&#xff08;destination&#xff09; 指向要在其中复制内容的目标数组的指针&#xff0c;类型转换为 void* 类型的指针。 源&#xff08;source&#xff09; 指向要复制的数据源的指针&#xff0c;类型转换为 const void* 类型的指针…

简单讲解memcpy函数并且实现memcpy函数

函数声明&#xff1a;void *memcpy(void*dest, const void *src, size_t n);//n代表的是字节 使用方法&#xff1a;由src指向地址为起始地址的连续n个字节的数据复制到以dest指向地址为起始地址的空间内。 返回值&#xff1a;在未开始复制之前&#xff0c;dest指向的地址。 …

C语言memcpy函数和memmove函数

memcpy函数和memmove函数都是C语言的库函数&#xff0c;作用都是从一个空间copy一定长度的内容到另一个空间&#xff0c;不同的是memcpy只是单纯的拷贝&#xff0c;当两个空间发生局部重叠时无法保证拷贝的正确&#xff08;正不正确取决于编译器&#xff09;&#xff0c;而memm…

memcpy函数用法

各位读者朋友们&#xff0c;由于更新blog不易&#xff0c;如果觉得这篇blog对你有用的话&#xff0c;麻烦关注&#xff0c;点赞&#xff0c;收藏一下哈&#xff0c;十分感谢。 1、简介 memcpy 函数用于把资源内存&#xff08;src所指向的内存区域&#xff09; 拷贝到目标内存…

【C库函数】memcpy函数详解

目录 memcpy 函数原型 参数讲解 返回值讲解 函数讲解&#xff08;三个注意点&#xff09; memcpy 拷贝内存块到目标空间 函数原型 void *memcpy( void *dest, const void *src, size_t count ); 参数讲解 参数destsrccount解析目标空间地址要拷贝内容空间源地址拷贝内容…

C语言——内存操作函数(memcpy、memmove、memcmp、memset)

文章目录 &#x1f4d8;前言&#x1f4d7; 一、memcpy&#xff08;内存拷贝&#xff09;&#x1f4d6; 1. 函数说明&#x1f4d6; 2. 模拟实现&#x1f4a1; 3. 运行图示: &#x1f4d7;二、memmove&#x1f4d6; 1. 函数说明&#x1f4d6; 2. 模拟实现&#x1f4a1; 3. 运行图…

memcpy函数详解 看这一篇就够了-C语言(函数讲解、 使用用法举例、作用)

memcpy()函数用于&#xff1a;复制内存块 函数介绍 函数声明&#xff1a;void * memcpy ( void * destination, const void * source, size_t num ); 参数 目的地&#xff1a;指向要在其中复制内容的目标数组的指针&#xff0c;类型转换为 void* 类型的指针。 源&#xff1a;指…

智慧校园信息化管理平台技术方案

1.2总体架构设计 智慧校园平台是以学校现有网络为基础&#xff0c;以服务于全校师生的教学、科研、生活为目的&#xff0c;建立在学校数据中心平台之上&#xff0c;涵盖了学校的学校管理、学生管理、教学管理、班级管理、家校共育、教务管理等全方位的管理信息平台与信息服务平…

县域教育信息化优质均衡建设解决方案

项目概述 “人才决定未来&#xff0c;教育成就梦想”。我国一直坚持不懈推进教育信息化&#xff0c;努力以信息化为手段扩大优质教育资源覆盖面。我国规划将通过教育信息化&#xff0c;逐步缩小区域、城乡数字差距&#xff0c;大力促进教育公平&#xff0c;让亿万孩子同在蓝天…

XXX高校数字化校园数据中心建设方案

目录 一、 项目概述 4 1.1建设背景 4 1.2建设目标 5 1.3建设原则 6 1.4云平台技术打造大数据与高性能优势 7 二、 需求分析 9 2.1现状分析 9 2.2总体建设 9 2.2.1XXX高校校园云平台需求 10 2.2.2大数据分析需求 10 2.2.3高性能需求 12 三、 数据中心总体规划 14 四…

智慧教育信息化建设解决方案

建设思路及解决方案 以数据整合、应用融合、服务聚合为目标&#xff0c;充分利用已有的成果&#xff0c;联接全校物联感知设备、构筑智能化安防体系&#xff0c;打造泛在化的学习环境、实现一体化的运维管控&#xff0c;最终形成智慧环境、智慧管理、智慧服务、智慧教学、智慧资…

信息化建设规划_职业院校教育信息化建设发展规划编制培训班圆满落幕!

9月24日至25日&#xff0c;由中国高等教育培训中心主办的职业院校教育信息化建设发展规划编制培训班&#xff0c;在重庆滨乐宝轩酒店盛大举行。会上&#xff0c;来自全国的教育专家、学者齐聚一堂&#xff0c;共同探讨智慧校园建设实现路径&#xff0c;面向与会的百余名教育工作…

如何建设教育信息化评价指标体系?

原创 CERNET 中国教育网络 2020-09-16 在教育信息化生态系统中&#xff0c;有三大推动力量&#xff1a;教育信息化评价指标体系制定、评估工作开展和评估建模分析&#xff0c;这三者相互依赖、相互影响。 01高校信息化建设的现状与问题 自从教育部发布《教育信息化2.0行动计…

某企业运营(集团)有限公司信息化建设规划方案

目录 1. 单位信息化建设现状分析 1.1 网络性能风险 1.2 管理功能风险 1.3 网络安全风险 1.4 数据安全风险 1.5 访问身份识别风险 1.6 信息化支撑环境风险 2. 需求分析 2.1 网络及管理需求分析 2.2 网络安全需求分析 2.3 …

教育信息化2.0建设解决方案

教育强则国家强&#xff0c;教育兴则民族兴。教育不仅关乎个体发展&#xff0c;家庭幸福&#xff0c;而且关乎国家强盛&#xff0c;民族复兴。教育是提高人民综合素质、促进人的全面发展的重要途径&#xff0c;是民族振兴、社会进步的重要基石&#xff0c;是对中华民族伟大复兴…

计算机在校学校目标和措施,学校信息化工作方案

学校信息化工作方案 指导思想&#xff1a; 以学校总体办学思路为指针&#xff0c;贯彻教育局信息中心&#xff0c;从务实、求真出发继续深入开展现代教育技术的普及工作&#xff0c;在积累经验的基础上&#xff0c;努力将信息教学普及化、提升管理使其规范化&#xff0c;加强管…