免费注册 查看新帖 |

Chinaunix

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

Linux下的内存对齐问题, 百思不得其解,在线等待 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-23 19:33 |只看该作者 |倒序浏览
typedef struct tagBMPFILEHEADER {
        unsigned short int                bfType;                        // 文件类型                2字节
        unsigned int                        bfSize;                        // 文件大小                4字节
        unsigned short int                bfReserved1;        // 保留位                2字节
        unsigned short int                bfReserved2;        // 保留位                2字节
        unsigned int                        bfOffBits;                // 数据偏移位置 4字节
}BMPFILEHEADER;


BMPFILEHEADER bf;
通过
sizeof(&bf.bfType) + sizeof(&bf.bfType) + sizeof(&bf.bfType) + sizeof(&bf.bfType) + sizeof(&bf.bfType);
得到大小为 2 + 4 + 2 + 2 + 4 = 14;


sizeof( bf ) 或 sizeof( BMPFILEHEADER ) 都为16

我觉得很奇怪,
如果内存对齐是以2字节为标准, 那么应该是 2 + 4 + 2 + 2 + 4 = 14 啊
如果内存对齐是以4字节为标准, 那么应该是 4 + 4 + 4 + 4 + 4 = 20 啊

为什么会 sizeof( bf ) 或 sizeof(BMPFILEHEADER) 都为16 呢?

这个16是如何计算出来的呢?

无法理解。

论坛徽章:
0
2 [报告]
发表于 2007-01-23 19:36 |只看该作者
非常抱歉,

sizeof(&bf.bfType) + sizeof(&bf.bfSize) + sizeof(&bf.bfReserved1) + sizeof(&bf.bfReserved2) + sizeof(&bf.bfOffBits);
得到大小为 2 + 4 + 2 + 2 + 4 = 14;

论坛徽章:
0
3 [报告]
发表于 2007-01-23 19:47 |只看该作者
我认为16是正确的。
4+4+2+2+4=16,关键看你怎么理解对齐

论坛徽章:
0
4 [报告]
发表于 2007-01-23 20:44 |只看该作者
http://dev.csdn.net/article/48/48195.shtm
我理解的是
2 + 4 + 2 =8
2 + 4 = 6
因为6不是4的倍数,所以就对齐成8字节.

论坛徽章:
0
5 [报告]
发表于 2007-01-23 21:36 |只看该作者
如果内存对齐是以2字节为标准, 那么应该是 2 + 4 + 2 + 2 + 4 = 14 啊
如果内存对齐是以4字节为标准, 那么应该是 4 + 4 + 4 + 4 + 4 = 20 啊
                                   -----> 4 + 4 + 2 + 2 + 4 = 16 啊

论坛徽章:
0
6 [报告]
发表于 2007-01-23 21:50 |只看该作者
|____|____|__|__|____|
0       4       8   10  12      16
si       i        si   si    i
上面si代表 short int,i代表int

论坛徽章:
0
7 [报告]
发表于 2007-01-23 23:16 |只看该作者
|____|____|__|__|____|
0       4       8   10  12      16
si       i        si   si    i
上面si代表 short int,i代表int

这个图非常直观, 我完全明白大家的意思.

为什么  第三和第四个unsigned short int 型属性各占2个字节?
如果是4字节对齐方式的话,应该是 4 + 4. 它们都应该是4字节.

如果说写成 unsigned short int array[2]
那我可以理解, 确实是 2+2.

迷惑.

论坛徽章:
0
8 [报告]
发表于 2007-01-24 10:04 |只看该作者
UP

论坛徽章:
0
9 [报告]
发表于 2007-01-24 10:09 |只看该作者

  1. 字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:

  2. 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
  3. 2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
  4. 3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
复制代码

论坛徽章:
0
10 [报告]
发表于 2007-01-24 11:16 |只看该作者
原帖由 liuke432 于 2007-1-24 10:09 发表
[code]
字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:

1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的 ...


这个说的好
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP