Linux下的memcpy函数

之前写过一篇关于 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://www.mzph.cn/news/464497.shtml

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

相关文章

linux命令行抓取网页快照-(xvfb+CutyCapt)

linux命令行抓取网页快照-&#xff08;xvfbCutyCapt&#xff09;又一个 WordPress 博客Browse: Home / 2009 / 十一月 / linux命令行抓取网页快照-&#xff08;xvfbCutyCapt&#xff09;linux命令行抓取网页快照-&#xff08;xvfbCutyCapt&#xff09;By saymoon on 2009年11月…

php过waf木马,一款过waf的一句话木马分析 | CN-SEC 中文网

摘要中午&#xff0c;下班回来&#xff0c;就看一个朋友给我发了几个马儿 让我看看解解密码 很简单中午&#xff0c;下班回来&#xff0c;就看一个朋友给我发了几个马儿 让我看看解解密码 很简单猛不猛我不知道 那时候手机 太长的看着就烦 就回到家瞅瞅了首先我们看这…

你没干什么坏事,你怕什么?

如图我很久就知道深信服这家企业&#xff0c;记得是几年前&#xff0c;我有一个同学跟我说&#xff0c;有一个比较厉害的朋友在这个企业上班&#xff0c;拿到了非常不错的薪水&#xff0c;我如果想去这个公司看看&#xff0c;可以让这位朋友帮忙搭线。后面查这个企业&#xff0…

python用循环打出阶梯图形,matplotlib阶梯图的实现(step())

step函数概述step函数用于绘制阶梯图。根据源码可知&#xff0c;step函数是对plot函数的轻量级封装&#xff0c;很多概念和用法与plot函数非常相似。def step(self, x, y, *args, wherepre, dataNone, **kwargs):cbook._check_in_list((pre, post, mid), wherewhere)kwargs[dra…

嵌入式还有哪些风口值得入?

大家好&#xff0c;我是写代码的篮球球痴前两天发了篇文章说到嵌入式薪资的&#xff0c;很多人想知道目前有哪些不错的行业可以加入&#xff0c;这篇文章罗列了很多风口行业。我相信&#xff0c;半导体芯片会是很重要的方向&#xff0c;但是不管路修得多好&#xff0c;都需要汽…

java 统计单词个数和标点符号

把随机输入的一句话比如:Its only a test!存放在一个char[]的数组中&#xff0c;统计char[]中的单词个数和标点符号的个数。 package com.faintbear; import java.io.*; publicclassTest{ public static void main(String[] args) throws Exception{ BufferedReade…

Luogu 4244 [SHOI2008]仙人掌图

BZOJ 1023 如果我们把所有的环都缩成一个点&#xff0c;那么整张图就变成了一棵树&#xff0c;我们可以直接$dp$算出树的直径。 设$f_x$表示$x$的子树中最长链的长度&#xff0c;那么对于$x$的每一个儿子$y$&#xff0c;先用$f_x f_y 1$更新答案&#xff0c;再用$f_y 1$更新…

outlook 2007 自动答复邮件

outlook 2007自动答复邮件 步骤 1&#xff1a;创建邮件模板 提示 从 Microsoft Office Online 下载正式&#xff08;英文&#xff09;或者非正式&#xff08;英文&#xff09;外出邮件模板。 在“文件”菜单上&#xff0c;指向“新建”&#xff0c;然后单击“邮件”。在“选项…

我的朋友去国外出差回不来了

年前&#xff0c;我一个朋友因为项目调试需要去国外出差&#xff0c;出国的时候好好的&#xff0c;然后飞到当地没几天疫情突然爆发&#xff0c;国内取消了那个国家的航班&#xff0c;然后就直接滞留在当地回不来了。我朋友从事的是硬件开发&#xff0c;包括器件选型、原理图设…

JDBCUtils

1 package database;2 3 import java.sql.Connection;4 import java.sql.DriverManager;5 import java.sql.ResultSet;6 import java.sql.SQLException;7 import java.sql.Statement;8 9 /** 10 * <p> 11 * Description:JDBCUtils工具类 12 * </p> 13 * 14 *…

很不错的Windows 控件 Developer Express Inc.NET

这个是我用 Developer Express Inc.NET 做的小东东&#xff01;很漂亮哦&#xff5e;&#xff01;文件太大了没办法上传&#xff0c;喜欢的可以去 http://www.dnc.com.cn 下载 还有注册机哦&#xff01; 转载于:https://www.cnblogs.com/xnet/archive/2005/12/21/301768.html

助你成为嵌入式高手的100多个软硬件开源项目

大家好&#xff0c;转发一个朋友总结的资料文章&#xff0c;内容如下大家好&#xff0c;我是老温&#xff0c;今天给大家推荐一个嵌入式开源项目汇总的仓库。学习初期最难找的就是找学习资料了&#xff0c;本贴精心汇总了一些嵌入式相关资源&#xff0c;包括但不限于编程语言、…

没有mmu可以跑Linux吗?

为什么需要mmu?我们知道应用程序是不能随意访问内存的&#xff0c;如果让应用程序直接访问物理内存&#xff0c;那么计算机是很危险的&#xff0c;计算机内存的所有内容将被完全暴露出来。所以出现了mmu&#xff0c;mmu是内存管理单元&#xff0c;应用程序访问的是虚拟内存&am…

pC机OracLe库磁盘坏如何恢复,电脑硬盘坏了数据能恢复吗(6步教你自己在家轻松恢复数据)...

电脑硬盘毁坏如何恢复数据有过硬盘损坏经历的用户都知道&#xff0c;硬盘损坏其最严重的结果就是导致其中存储的文件难以读取&#xff0c;包括无法复制&#xff0c;无法移动。通常来说&#xff0c;具体的表现形式是复制文件或者传输文件的时候&#xff0c;耗费很长的时间都无法…

又重新让aspspider.net支持中文PDF输出了

经过一番努力&#xff0c;再次看到中文PDF的输出&#xff1b;aspspider.net经过这次更新后&#xff0c;不知道什么原因&#xff0c;使用BaseFont.AddToResourceSearch(MapPath(".\itextsharpasian\") "iTextAsian-1.0.dll");的方法就是不能把iTextAsian-1.…

My new iMac 27

iMac 27 12GB Memory. 用来贴补家用&#xff0c;有需要开发项目的可以与我联系 asp.net、组件开发 ,java,javascript,xml/xslt,objective-c 什么都行. 目前上架产品包括&#xff1a;少儿有声阅读系列《单刀会》《白蛇传》《空城记》&#xff0c;新闻阅读有 “辽宁日报” “辽宁…

从没想过会有一个这样的机会|大疆招聘

我是昨晚才知道&#xff0c;年前有一个读者一直在找工作最近准备入职大疆&#xff0c;之前我也有给他推荐了机会&#xff0c;不过都没有合适的。昨晚突然给我发消息说拿到了大疆的岗位&#xff0c;待遇和职位都是自己喜欢的。我的微信好友有好几个大疆的同学&#xff0c;刚好昨…

Google Earth 和MS Virtual Earth:虚拟地球简介

自从Goal在98年提出数字地球&#xff08;Digital Earth&#xff09;之后&#xff0c;全球掀起了数字地球热&#xff0c;而随着Goal的竞选总统的失利和当时科学技术和硬件水平的限制&#xff0c;数字地球一直处于慢慢发展状态。其中它涉及到很多学科包括地理对象的描述、存储、建…

转些别人收集的歌

2019独角兽企业重金招聘Python工程师标准>>> 【Anaesthesia】Maximilian Hecker强烈推荐 【Summer Days In Bloom】Maximilian Hecker力推&#xff01; 【end of May】Keren Ann 【gotta have you】The Weepies调调很特别&#xff0c;我用它做过背景音乐。 …

Linux社区关于链表的bug讨论我们要看一下

最近在Linux社区看到一个关于内核链表的讨论原文讨论链接&#xff1a;https://lwn.net/SubscriberLink/885941/01fdc39df2ecc25f/先用例子说明怎么使用内核链表list.h/* SPDX-License-Identifier: GPL-2.0 */ #ifndef LIST_H #define LIST_H/** Copied from include/linux/...*…