[2017年整理]关于结构体的内存对齐

上传人:豆浆 文档编号:913473 上传时间:2017-05-21 格式:DOC 页数:3 大小:144KB
返回 下载 相关 举报
[2017年整理]关于结构体的内存对齐_第1页
第1页 / 共3页
[2017年整理]关于结构体的内存对齐_第2页
第2页 / 共3页
[2017年整理]关于结构体的内存对齐_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《[2017年整理]关于结构体的内存对齐》由会员分享,可在线阅读,更多相关《[2017年整理]关于结构体的内存对齐(3页珍藏版)》请在金锄头文库上搜索。

1、关于结构体的内存对齐内存是以字节为单位编号,但一些硬件平台对某些特定类型的数据只能从某些特定地址开始,比如从偶地址开始。若不按照适合其平台的要求对数据存放进行对齐,会影响到效率。因此,在内存中,各类型的数据是按照一定的规则在内存中存放的,这就是本文要研究的对齐问题。本文以 gcc version 4.4.5,32 位 x86 环境为例,来分析结构体中各成员如何进行对齐。我们要注意两个方面:1)结构体成员变量对存放的起始地址有要求。2)结构体变量占用的总长度也有要求。结构体对齐规则如下:数据成员最终的存放地址:对齐在自身类型长度和 pragma pack(value)指定值中较小的值上。结构体的

2、总长度:对齐在成员类型长度最大的值和 pragma pack(value)指定值中较小的值上。所谓“对齐在 N 上” ,指定是 “存放起始地址%N=0 ”看下面几个例子:例 1:分析:此程序的测试环境,相当于 pragma pack(4) ,a 成员的起始地址是 0xbfe8ff18,char 类型长度 1,pragma pack(4),取小的 1, 0xbfe8ff18%1=0,符合规则。b 成员,short 类型长度 2,pragma pack(4),取小的 2,若存在地址 0xbfe8ff19,则0xbfe8ff19%2 余数为 1,不是 0,所以只能空出一个字节,在 0xbfe8ff1

3、a 地址存放。c 成员,int 类型长度 4,pragma pack(4),取小的 4,若存在地址 0xbfe8ff1a+2,即0xbfe8ff1c 处,则 0xbfe8ff1c%4 余数为 0,符合规则。这样整个结构体,占用了内存的 0xbfe8ff180xbfe8ff1f, 共 8 个字节。结构体的总长度是要求“对齐在成员类型长度最大的值和 pragma pack(value)指定值中较小的值上。 ”这里是要求能被 4 除尽,8 符合要求,所以 sizeof(struct F)是 8.例 2:a 成员的起始地址是 0xbfe8ff18,char 类型长度 1,pragma pack(4),

4、取小的 1, 0xbfbb41a8%1=0。b 成员,int 类型长度 4,pragma pack(2),取小的 2,若存在地址 0xbfbb41a9,则0xbfbb41a9%2 余数为 1,不是 0,所以只能空出一个字节,在 0xbfbb41aa 地址存放。c 成员,short 类型长度 2,pragma pack(2),取小的 2,若存在地址 0xbfbb41aa +4,即0xbfbb41ae 处,则 0xbfbb41ae %4 余数为 0,符合规则。这样整个结构体,占用了内存的 0xbfbb41a80xbfbb41af, 共 8 个字节。结构体的总长度是要求“对齐在成员类型长度最大的值和 pragma pack(value)指定值中较小的值上。 ”这里是要求能被 2 除尽,8 符合要求,所以 sizeof(struct F)是 8.例 3:具体的分析,不再重复,读者可以和上面的例子做个比较,有了 pragma pack(4)后,结构体的总长度,为 12,不再是 8。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号