内存对齐算法
2021/12/7 7:18:48
本文主要是介绍内存对齐算法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
什么是向上对齐?向上对齐是指根据某些硬件平台或函数的要求,对要处理的数据大小需要保证一定的规则。常见的是内存对齐,比如要保证4字节的内存对齐,代码如下(注意其中的符号——&):
#define MEM_ALIGN_SIZE(size) (((size) + 3) & (~3))
通常情况下,对齐的大小为2的整数次幂,4,8,16... 这种大小的对齐方式这样写:
#define ALIGN_SIZE 4 #define UPPER_ALIGN(size) (((size) + ALIGN_SIZE - 1) & (~(ALIGN_SIZE - 1)))
比如,某一款存储芯片只能以512字节的方式进行读写,但是为了保证程序的兼容性(有些芯片支持随机读写),读写数据时我不能固定的以512字节进行读写,我会增加一个抽象层,对应用层屏蔽存储芯片的不同。如下图所示:
抽象层中肯定是随机读写函数,但是到了操作具体的存储芯片时就需要保证512字节的对齐了。伪代码如下:
/*芯片读取函数*/ #define ALIGN_SIZE 512 #define UPPER_ALIGN(size) (((size) + ALIGN_SIZE - 1) & (~(ALIGN_SIZE - 1))) int32_t chip_content_read(chip_id, content_buf, read_size) { //upper align read_size = UPPER_ALIGN(read_size); ... }
注意:
只有要对齐的数字是2的整数次幂的时候,才能使用取地址符号——&。如果数字不是2的整数次幂,那么就该这样写:
#define ALIGN_SIZE 9 #define UPPER_ALIGN(size) ((((size) + ALIGN_SIZE - 1) / (ALIGN_SIZE)) * (ALIGN_SIZE)))
其实,以2的整数次幂进行对齐时,也可以写成上面这种形式,只不过因为对齐的数字是2的整数次幂,有些特殊,故可以使用取地址符&(请大家自行证明下,代码看千遍,不如动手敲一遍)。
Tips:
对2的整数次幂的数据进行商和取余,有两个小技巧。假设m为2的整数次幂。
求商——n/m:
n / m = n >> log2(m)
求余——n%m:
n % m = n & (m - 1)
墙裂建议大家看下linux内核中的log2.h,收获多多哟!!!
这篇关于内存对齐算法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-07-02springboot项目无法注册到nacos-icode9专业技术文章分享
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)