免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2711 | 回复: 6
打印 上一主题 下一主题

gcc中内存组织问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-15 10:47 |只看该作者 |倒序浏览
struct BitMapFileHeader{
                /**
                *文件类型,必须为0x4d42
                */

                unsigned short  bfType;//文件类型,必须为0x4d42
                /**
                *文件大小
                */

                unsigned long   bfSize;//文件大小
                /**
                *保留字
                */

                unsigned short  bfReserved1;
                unsigned short  bfReserved2;//保留字,必须为0
                /**
                *文件偏移
                */

                unsigned long   bfOffBits;//文件偏移
};

为什么sizeof(BitMapFileHeader)是16而不是14?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2008-05-15 12:38 |只看该作者
把每个变量的地址打出来看看就明白了。

论坛徽章:
0
3 [报告]
发表于 2008-05-15 14:59 |只看该作者
找出每个成员变量占用的空间大,那么最后的长度就是它的倍数。
我感觉是这样的。你试试

论坛徽章:
0
4 [报告]
发表于 2008-05-15 16:19 |只看该作者
>>>为什么sizeof(BitMapFileHeader)是16而不是14?

short  bfType 和 unsigned long   bfSize之间为了对齐空了两个字节

论坛徽章:
0
5 [报告]
发表于 2008-05-15 23:08 |只看该作者
在使用sizeof前,需要了解指令的字节对齐情况

本例中sizeof(BitMapFileHeader)是16而不是14,说明为4字节对齐

常见的字节对齐有1、2、4字节对齐,各种情况分析分别如下:

1字节对齐       变量           内存组织
unsigned short  bfType          --> 1 byte
unsigned long   bfSize            --> 4 bytes
unsigned short  bfReserved1 --> 1 byte
unsigned short  bfReserved2 --> 1 byte
unsigned long   bfOffBits        --> 4 bytes

sizeof(BitMapFileHeader) = 11 bytes

2字节对齐       变量           内存组织
unsigned short  bfType          --> 1 byte
                                              --> 1 byte (alignment,字节对齐)
unsigned long   bfSize           --> 4 bytes
unsigned short  bfReserved1 --> 1 byte
unsigned short  bfReserved2 --> 1 byte
unsigned long   bfOffBits        --> 4 bytes

sizeof(BitMapFileHeader) = 12 bytes

4字节对齐       变量           内存组织  (A)
unsigned short  bfType          --> 1 byte
                                              --> 3 bytes (alignment,字节对齐)
unsigned long   bfSize           --> 4 bytes
unsigned short  bfReserved1 --> 1 byte
unsigned short  bfReserved2 --> 1 byte
                                              --> 2 bytes (alignment,字节对齐)
unsigned long   bfOffBits       --> 4 bytes

sizeof(BitMapFileHeader) = 16 bytes

通过上述各种情况的分析,可以发现:合理的组织成员变量,可以达到内存的最大利用

4字节对齐为例,如:
1字节对齐       变量           内存组织  (B)
unsigned long   bfSize            --> 4 bytes
unsigned short  bfType          --> 1 byte
unsigned short  bfReserved1 --> 1 byte
unsigned short  bfReserved2 --> 1 byte
                                              --> 1 byte (alignment,字节对齐)
unsigned long   bfOffBits       --> 4 bytes

sizeof(BitMapFileHeader) = 12 bytes

比较(A)和(B),(B)相对(A)节省了4个字节的内存空间

论坛徽章:
0
6 [报告]
发表于 2008-05-16 11:21 |只看该作者

回复 #5 tinggkong 的帖子

"unsigned short"的长度是2bytes的

论坛徽章:
0
7 [报告]
发表于 2008-05-16 12:28 |只看该作者
因为内存对齐.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP