Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Kernel
C库_LIBC
对rt_memcpy 函数的疑问
发布于 2019-03-10 08:45:36 浏览:4608
订阅该版
[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.6k
关于作者
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
单片机也能聊天?RT-Thread上跑通大语言模型
2
【RT-Thread】【ci】【scons】将ci.attachconfig.yml和scons结合使用
3
Rt-thread中OTA下载后,bootloader不搬程序
4
ulog 日志 LOG_HEX 输出时间改为本地日期时间
5
在RT-Thread Studio中构建前执行python命令
热门标签
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
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
出出啊
1518
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
5
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部