Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Kernel
C库_LIBC
对rt_memcpy 函数的疑问
发布于 2019-03-10 08:45:36 浏览:4450
订阅该版
[tocm] # rt_memcpy函数疑问 有一次面试,面试官让写一下c库memcpy函数实现。当时认为很简单,内存拷贝不就是赋值吗,所以快速的写了出来,回来后仔细想想有很多问题,研究了一下rt-thread的memcpy,看完之后有个地方不太明白,请教一下 * 先简单写一下面试时的情况,当时写的函数是这样的: ```c void my_memcpy(char *const des,char *const res,int len) { volatile int i=0; if((dec == NULL)||(res == NULL)) return; for(i=0;i
(s + count)) { while (count--) *tmp ++ = *s ++; } else { for(len = count; len > 0; len --) tmp[len -1] = s[len - 1]; } return dst; #else #define UNALIGNED(X, Y) \ (((rt_int32_t)X & (sizeof(rt_int32_t) - 1)) | \ ((rt_int32_t)Y & (sizeof(rt_int32_t) - 1))) #define BIGBLOCKSIZE (sizeof(rt_int32_t) << 2) #define LITTLEBLOCKSIZE (sizeof(rt_int32_t)) #define TOO_SMALL(LEN) ((LEN) < BIGBLOCKSIZE) char *dst_ptr = (char *)dst; char *src_ptr = (char *)src; rt_int32_t *aligned_dst; rt_int32_t *aligned_src; int len = count; /* If the size is small, or either SRC or DST is unaligned, then punt into the byte copy loop. This should be rare. */ if (!TOO_SMALL(len) && !UNALIGNED(src_ptr, dst_ptr)) { aligned_dst = (rt_int32_t *)dst_ptr; aligned_src = (rt_int32_t *)src_ptr; /* Copy 4X long words at a time if possible. */ while (len >= BIGBLOCKSIZE) { *aligned_dst++ = *aligned_src++; *aligned_dst++ = *aligned_src++; *aligned_dst++ = *aligned_src++; *aligned_dst++ = *aligned_src++; len -= BIGBLOCKSIZE; } /* Copy one long word at a time if possible. */ while (len >= LITTLEBLOCKSIZE) { *aligned_dst++ = *aligned_src++; len -= LITTLEBLOCKSIZE; } /* Pick up any residual with a byte copier. */ dst_ptr = (char *)aligned_dst; src_ptr = (char *)aligned_src; } while (len--) *dst_ptr++ = *src_ptr++; return dst; #undef UNALIGNED #undef BIGBLOCKSIZE #undef LITTLEBLOCKSIZE #undef TOO_SMALL #endif } ``` * 先来描述一下函数中的几个宏定义,看看是否理解上有错误 1. 宏`UNALIGNED(X, Y)` 用来判断输入的两个值能否被4整除,通过和`sizeof(rt_uint32_t)-1`&计算来判断,地址的后两位是0,表示能被4整除,内存是对齐的,返回0,内存不对齐则返回1; 2. 宏`BIGBLOCKSIZE` 拷贝大内存块的长度`sizeof(rt_uint32_t)<<2` 表示4左移2位 等于16 3. 宏`LITTLEBLOCKSIZE` 拷贝小内存块长度`(sizeof(rt_int32_t))` 表示4 4. `TOO_SMALL(LEN)` 检测长度len的大小,len大于16返回0,否则返回1 * 看完之有个问题: 语句:`if (!TOO_SMALL(len) && !UNALIGNED(src_ptr, dst_ptr))` 根据上下文理解,这句代码的意思是len的长度大于16且内存地址能被4整除,才进行大块的拷贝。为什么要能被4整除呢?函数的内部拷贝16字节后是`len-=BIGBLOCKSIZE`,剩余不足16字节时是`len -= LITTLEBLOCKSIZE`,不足4字节时按照byte拷贝,感觉地址和是不是能被4整除没有关系啊?
查看更多
3
个回答
默认排序
按发布时间排序
zhulaee
2021-04-21
这家伙很懒,什么也没写!
不用memcpy函数, 而简单的用‘=‘ 给结构体 赋值 可以吗? 是否涉及到指针成员的问题?
还没想好
2019-03-10
这家伙很懒,什么也没写!
如果访问 32 位地址,就需要 4 字节对齐
emlsyx
2019-03-12
这家伙很懒,什么也没写!
>如果访问 32 位地址,就需要 4 字节对齐 谢谢
撰写答案
登录
注册新账号
关注者
1
被浏览
4.5k
关于作者
emlsyx
这家伙很懒,什么也没写!
提问
5
回答
8
被采纳
0
关注TA
发私信
相关问题
1
请教cpu使用率分析
2
选择FreeRTOS, 还是RT-Thread。
3
thread heap stack overflow ?
4
rtt消息队列delay问题
5
释放被删除线程的内存地方在哪里啊
6
请教:各线程结束后,释放其中的内存的连续性问题
7
STM32F103中断关于信号量、邮箱问题
8
RTT中的线程栈大小如何控制
9
关于线程由执行态变为挂起态的代码实现,,,
10
rt_malloc(rt_size_t size)内存分配函数最小分配尺寸问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
7
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
3
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部