内存对齐
发布日期:2021-07-01 04:24:09
浏览次数:2
分类:技术文章
本文共 1462 字,大约阅读时间需要 4 分钟。
文章目录
1 内存对齐的基本概念
1.1 什么是内存对齐
内存对齐的概念:
- 不同类型的数据在内存中按照一定的规则排列。
- 而不一定是顺序的一个接一个的排列。
1.2 内存对齐的原因
为什么需要内存对齐?
- CPU对内存的读取不是连续的,而是分成块读取的,块的大小只能是1、2、4、8、16…字节。
- 当读取操作的数据未对齐,则需要两次总线周期来访问内存,因此性能会大打折扣。
- 某些硬件平台只能从规定的相对地址处读取特定类型的数据,否则产生数据异常。
#pragma pack用于指定内存对齐方式。
2 #pragma pack
2.1 #pragma pack的使用方式
#pragma pack能够改变编译器的默认对齐方式。
以struct为例,分析内存对齐方式,struct占用的内存大小:
- 第一个成员起始于0偏移处。
- 每个成员按其类型大小和pack参数中较小的一个进行对齐。
- 偏移地址必须能被对齐参数整除。
- 结构体成员的大小取其内部长度最大的数据成员作为其大小。
- 结构体总长度必须为所有对齐参数的整数倍。
编译器默认情况下按照4字节对齐,gcc不支持8字节对齐。
结构体内存对齐分析(32位编译环境):
// 1字节对齐#pragma pack(1)struct Test0{ // 对齐参数 起始字节 占用字节 char c1; // 1 0 1 short s; // 1 1 2 char c2; // 1 3 1 int i; // 1 4 4}; // 总共占用8字节#pragma pack()#pragma pack(2)struct Test1{ // 对齐参数 起始字节 占用字节 char c1; // 1 0 1 short s; // 2 2 2 char c2; // 1 4 1 int i; // 2 6 4}; // 总共占用10字节#pragma pack()#pragma pack(4)struct Test2{ // 对齐参数 起始字节 占用字节 char c1; // 1 0 1 char c2; // 1 1 1 short s; // 2 2 2 int i; // 4 4 4}; // 总共占用8字节#pragma pack()#pragma pack(8)struct S1{ // 对齐参数 起始字节 占用字节 short a; // 2 0 2 long b; // 4 4 4}; // 总共占用8字节struct S2{ // 对齐参数 起始字节 占用字节 char c; // 1 0 1 struct S1 d; // 4 4 8 double e; // 8 16 8}; // 总共占用24字节#pragma pack()
参考资料:
转载地址:https://muzimin.blog.csdn.net/article/details/103766843 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2024年05月01日 15时01分22秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Unix环境变量--线程基础
2019-05-02
Unix环境变量--缓冲区
2019-05-02
Unix环境变量--POSIX异步I/O
2019-05-02
UNIX环境变量--存储映射I/O
2019-05-02
tinyhttpd源码学习1
2019-05-02
Plus One
2019-05-02
Linux内核完全剖析0.12(一)
2019-05-02
Sum Root to Leaf Numbers
2019-05-02
ffmpeg提取音频存为PCM
2019-05-02
Reverse Linked List II
2019-05-02
题目1511:从尾到头打印链表
2019-05-02
为什么 Redis 要比 Memcached 更火?
2019-05-02
涨姿势:为啥MySQL官方不推荐使用uuid或者雪花id作为主键?
2019-05-02
一个小小的签到功能,到底用MySQL还是Redis?
2019-05-02
36岁退休!阿里 P8 六年实现“财务自由”,裸辞环游世界!
2019-05-02
QQ号终于能修改了?
2019-05-02
1.3 万亿条数据查询,如何做到毫秒级响应?
2019-05-02
高赞回答:为什么高级程序员不必担心自己的技术过时?
2019-05-02
支持 Dubbo 接口文档生成的工具
2019-05-02
SpringBoot集成WebSocket,实现后台向前端推送信息
2019-05-02