sizeof(struct)对齐方式
来源:互联网 发布:淘宝新开店铺旺旺采集 编辑:程序博客网 时间:2024/06/01 08:33
结构体是一种复合数据类型,通常编译器会自动的进行其成员变量的对齐,已提高数据存取的效率。在默认情况下,编译器为结构体的成员按照自然对齐(natural alignment)条方式分配存储空间,各个成员按照其声明顺序在存储器中顺序存储。自然对齐是指按照结构体中成员size最大的对齐,在cl编译器下可以使用
#pragma pack(n)
来指定结构体的对齐方式。
默认对齐方式
在默认对齐方式下,结构体成员的内存分配满足下面三个条件
- 结构体第一个成员的地址和结构体的首地址相同
- 结构体每个成员地址相对于结构体首地址的偏移量(offset)是该成员大小的整数倍,如果不是则编译器会在成员之间添加填充字节(internal adding)。
- 结构体总的大小要是其成员中最大size的整数倍,如果不是编译器会在其末尾添加填充字节(trailing padding)。
可以使用#pragma pack(N)来指定结构体成员的对齐方式
对于指定的对齐方式,其成员的地址偏移以及结构的总的大小也有下面三个约束条件
- 结构体第一个成员的地址和结构体的首地址相同
- 结构体每个成员的地址偏移需要满足:N大于等于该成员的大小,那么该成员的地址偏移需满足默认对齐方式(地址偏移是其成员大小的整数倍);N小于该成员的大小,那么该成员的地址偏移是N的整数倍。
- 结构体总的大小需要时N的整数倍,如果不是需要在结构体的末尾进行填充。
- 如果N大于结构体成员中最大成员的大小,则N不起作用,仍然按照默认方式对齐。
在有#progma pack(n)参数的情况,各子项的对齐系数为min(自己长度,n);
struct 整体的对其系数为子项对齐系数最大值
最后总结下,默认对齐时,每个元素的距离首地址的偏移量,必须是该元素大小的倍数,struct整体大小必须是内部元素最大元素大小的倍数。
在progma pack(n)的情况下,各个元素距离首地址的偏移量min(本元素大小,n),struct整体大小必须是min(内部最大元素大小,n)的倍数。
0 0
- sizeof(struct)对齐方式
- sizeof (union) (struct) 内存对齐方式
- c++struct sizeof大小对齐方式
- union, struct , sizeof. 对齐
- sizeof-对齐-struct
- sizeof union struct 内存对齐
- sizeof union struct 内存对齐
- 自然对齐:sizeof struct, union
- sizeof struct class 字节对齐
- (经典)struct和 union用 sizeof 看字节对齐,以及__declspec( align( # ) ) 和 #pragma pack()的使用方式
- struct对齐方式
- struct对齐方式
- Struct对齐方式
- struct对齐方式
- sizeof(struct)--关于字节对齐的问题
- 结构体对齐sizeof(struct x)
- struct 对齐机制和sizeof 笔记
- struct union数据对齐和sizeof大小
- 第十一节下篇:Object类
- img 标签元素
- Android Linker 与 SO 加壳技术
- mac上的终端bash命令
- Python环境配置之Scrapy安装
- sizeof(struct)对齐方式
- miniUI日历控件只可以选择当前之前日期
- JFinal Web开发学习(四)数据库连接与自动生成model
- 移动数据通信网络工作原理(SGSN&GGSN)
- Codeforces 279B books
- 在PHP代码中取得当前日期时间再插入数据库
- UVa 10054 项链(欧拉路)
- git远程版本库
- 第十二节:Scanner类与String类介绍(讲师笔记)