Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Kernel
C库_LIBC
对rt_memcpy 函数的疑问
发布于 2019-03-10 08:45:36 浏览:3946
订阅该版
[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
被浏览
3.9k
关于作者
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
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
五分钟玩转RT-Thread新社区
5
国产MCU移植系列教程汇总,欢迎查看!
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
[Vision Board创客营]WDT实践之配置、issue、PR一条龙
2
恩智浦FRDM-MCXN947上的RW007联网实践
3
[Vision Board创客营]学习片上Flash移植FAL
4
MCXN947测评系列(二)串口设备测评
5
NXP MCXN947实践:基于 rt-thread的驱动模块配置PWM
热门标签
RT-Thread Studio
串口
LWIP
Env
SPI
Bootloader
AT
ART-Pi
CAN总线
Hardfault
FinSH
USB
文件系统
DMA
RT-Thread
SCons
线程
RT-Thread Nano
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
ota在线升级
WIZnet_W5500
I2C_IIC
UART
cubemx
flash
packages_软件包
freemodbus
潘多拉开发板_Pandora
PWM
定时器
ADC
BSP
中断
keil_MDK
编译报错
socket
MicroPython
GD32
msh
Debug
ulog
SDIO总线
SFUD
rt_mq_消息队列_msg_queue
C++_cpp
本月问答贡献
sakumisu
4
个答案
3
次被采纳
xiaorui
6
个答案
2
次被采纳
三世执戟
31
个答案
1
次被采纳
梦笑真美
17
个答案
1
次被采纳
踩姑娘的小蘑菇
13
个答案
1
次被采纳
本月文章贡献
Z_Y
2
篇文章
5
次点赞
2345vor
2
篇文章
1
次点赞
比特饼干
1
篇文章
6
次点赞
Lu_盼盼
1
篇文章
3
次点赞
猪的行独
1
篇文章
3
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部