结构体内存对齐
2016-05-15 13:43
176 查看
关于结构体内存对齐有一下几条原则:
1.每个元素的偏移量=Min(对应元素的字节数,系统或编译器的对齐字节数)。
2.结构体的大小的,其最大元素字节数的整数倍。
3.结构体的大小是,最后一个元素偏移量+最后一个元素大小+可能补充的字节。
4.如果结构体中有数组,当做单一元素看待。
上面连个结构体大小,其实是不同的。
先看aa2:
c的偏移量为0,c为4字节。下个偏移量至少从4开始。szBuf是5个char。偏移量为1的倍数,自然是1.所以偏移量为4。
结构体大小=最后一个元素偏移量4+最后一个元素大小5+可能补充的字节(结构体是最大元素的整数倍,最大元素是int4字节,现在是4+5=9),所以补充3=12.
再看aa1:
c的偏移量为0,c为4个char字节。下个偏移量也是至少从4开始。szBuf是5个char。偏移量为1的倍数,自然是1。所以偏移量为4。
结构体大小=最后一个元素偏移量4+最后一个元素大小5+可能补充的字节(结构体是最大元素的整数倍,最大元素是char1字节,现在是4+5=9),所以无需补充=9。
2017年2月7日 修改:
上面的原理太复杂了,不方便理解。今天又仔细想了想,参考了下百度百科的一个#pragma pack就豁然开朗了。
先附说明:
编译器中提供了#pragma pack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。结构的总大小也有个约束条件,分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数;否则必须为n的倍数。
总结一下:
1.每个元素的对齐为 MIN(元素自身打下,系统字节对齐值)。
2.结构体总大小为 MIN(结构体中最长元素宽度,系统字节对齐值)的整数倍。
注:
1.数组元素按照单一变量看待,比如double[2]对齐长度按照double看待
2.如果结构体中有结构体。当做整体看待,不参与结构体外其余元素的字节间隙。
1.每个元素的偏移量=Min(对应元素的字节数,系统或编译器的对齐字节数)。
2.结构体的大小的,其最大元素字节数的整数倍。
3.结构体的大小是,最后一个元素偏移量+最后一个元素大小+可能补充的字节。
4.如果结构体中有数组,当做单一元素看待。
struct aa1{ char c[4]; //1byte char szBuf[5]; };
struct aa2{ int c; char szBuf[5]; };
上面连个结构体大小,其实是不同的。
先看aa2:
c的偏移量为0,c为4字节。下个偏移量至少从4开始。szBuf是5个char。偏移量为1的倍数,自然是1.所以偏移量为4。
结构体大小=最后一个元素偏移量4+最后一个元素大小5+可能补充的字节(结构体是最大元素的整数倍,最大元素是int4字节,现在是4+5=9),所以补充3=12.
再看aa1:
c的偏移量为0,c为4个char字节。下个偏移量也是至少从4开始。szBuf是5个char。偏移量为1的倍数,自然是1。所以偏移量为4。
结构体大小=最后一个元素偏移量4+最后一个元素大小5+可能补充的字节(结构体是最大元素的整数倍,最大元素是char1字节,现在是4+5=9),所以无需补充=9。
2017年2月7日 修改:
上面的原理太复杂了,不方便理解。今天又仔细想了想,参考了下百度百科的一个#pragma pack就豁然开朗了。
先附说明:
编译器中提供了#pragma pack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。结构的总大小也有个约束条件,分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数;否则必须为n的倍数。
总结一下:
1.每个元素的对齐为 MIN(元素自身打下,系统字节对齐值)。
2.结构体总大小为 MIN(结构体中最长元素宽度,系统字节对齐值)的整数倍。
注:
1.数组元素按照单一变量看待,比如double[2]对齐长度按照double看待
2.如果结构体中有结构体。当做整体看待,不参与结构体外其余元素的字节间隙。
相关文章推荐
- XenServer 6.5实战系列:Creating a VM Template from a VM Snapshot
- 1006
- 手机那点事!已有高人把常见的不常见的坑都给找出来了,我就随便转一下了
- 前缀++ 后缀++ 运算符重载
- Freemarker第一次实际项目使用遇到的一些问题
- 如何在自己的CSDN博客中增添【高大上】的博客栏目?
- javascript页面操作
- javascript页面操作
- XenServer 6.5实战系列:Creating a VM Template from an Existing VM
- VS 2015 拖动numericUpDown控件VS无响应(包括VS2013)
- MyBatis学习--高级映射
- coocs2dx 2.0 和3.0版本区别
- Spark Broadcast运行机制解密(42)
- Java:网上超市购物结算功能模拟
- Tensorflow MNIST浅层神经网络的解释和答复
- Tensorflow MNIST浅层神经网络的解释和答复
- [安卓开发] 快递物流信息布局
- 练习三1016-走塌陷的格子
- java基础:反射
- 两次拉格朗日中值证明曲线凹凸性定理_2016514