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,一经查实,立即删除!

相关文章

extern关键字讲解

基本解释   extern可以置于变量或者函数前&#xff0c;以标示变量或者函数的定义在别的文件中&#xff0c;提示编译器遇到此变量和函数时在其他模块中寻找其定义。   另外&#xff0c;extern也可用来进行链接指定。 2 问题&#xff1a;extern 变量   在一个源文件里定义了…

日志钩子(JournalRecord Hook)的使用

-- 钩子是WINDOWS中消息处理机制的一个要点&#xff0c;通过安装各种钩子&#xff0c;应用程序能够设置相应的子例程来监视系统里的消息传递以及在这些消息到达目标窗口程序之前处理它们。钩子的种类很多&#xff0c;每种钩子可以截获并处理相应的消息&#xff0c;如键盘钩子可…

优先队列

CSTL——优先队列 一、相关定义 优先队列容器与队列一样&#xff0c;只能从队尾插入元素&#xff0c;从队首删除元素。但是它有一个特性&#xff0c;就是队列中最大的元素总是位于队首&#xff0c;所以出队时&#xff0c;并非按照先进先出的原则进行&#xff0c;而是将当前队列…

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…

C++中的explicit关键字用法

c中的explicit关键字用来修饰类的构造函数&#xff0c;被修饰的类的构造函数不能进行隐式类型的转换&#xff0c;既然有"显式"那么必然就有"隐式"&#xff0c;那么什么是显示而什么又是隐式的呢&#xff1f; 如果c类的构造函数有一个参数&#xff0c;那么…

警告用户:VoIP电话存在诸多风险

IP电话是目前最为受欢迎的通信方式&#xff0c;但最近VoIP安全组织表示其拥有许多安全隐患。 该组织发布了一份IP电话供应商潜在的安全风险清单。旧式的公共开关网络电话&#xff08;PSTN&#xff09;并没有远离风险&#xff0c;而今VoIP也要加入这一风险行列。 秘密被偷听&…

织梦文章添加字段填栏目id,内容页调用字段里的栏目文章

在模型里增加个字段&#xff0c;然后在添加文章的时候&#xff0c;在字段里填了栏目id进去 在前台的内容页&#xff0c;调用这个字段栏目的多个文章出来 {dede:field.field1 runphpyes} global $dsql; $sql "select arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault…

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…

xbmc addons

XBMC新版“扩展功能”简介 目录1. 扩展功能模块结构2. 图片文件指引 2.1 icon.png2.2 fanart.jpg3. addon.xml 3.1 <addon>元素3.2 <requires>元素3.3 <extension>元素3.4 xbmc.addon.metadata extension4. extension类别本贴介绍将在即将发布的XBMC Dharma&…

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

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

两个学习指针的例子

下面的结果是多少&#xff1f; int a5; int *example1(int b) { ab; return &a; } int *example2(int b) { int c5; bc; return &b; } void main() { int *a1example1(10); int *b1example2(10); cout <<”a1”<<*a1; cout <<”b1”<&l…

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$更新…

trim的返回值php,php trim()函数

(1)trim()函数。该函数可以去除字符串开始位置以及结束位置的空格&#xff0c;并返回去掉空格后的字符串。该函数声明如下&#xff1a;string trim ( string str [, string charlist])默认的情况下&#xff0c;该函数去除的字符如下。" " (ASCII 32 码为(0x20))&…

outlook 2007 自动答复邮件

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

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

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

再谈borland与MS对BUG的不同态度~

在讨论Delphi 6 SP1对BUG的修补问题时(http://www.delphibbs.com/delphibbs/dispq.asp?lid648516)&#xff0c;我提及“强烈建议Borland针对自己的产品出hotfix&#xff0c;而不是让大家非得等到Server Pack”&#xff0c;随后与y9y兄讨论到Borland和MS的不同态度。或者我们可…

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 *…