关于字节对齐

freekingdong 2009-02-28 11:54:06
#include<windows.h>
#include<iostream>
using namespace std;
struct s{
byte d;
byte w;
DWORD t;
};
main()
{
struct r;
int a=sizeof(s);
cout<<a<<endl;
}
byte 占一个字节,DWORD 占4个字节 怎么s会是8呢?
...全文
72 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xhy_851221 2009-02-28
  • 打赏
  • 举报
回复
因为有DWORD所以是四字节对齐
d和w各占一个,接着两个用空填充
保证t开始的位置能被4整除即:
dw t
01234567
d占0,w占1,
2,3空
t占4,5,6,7
kostion 2009-02-28
  • 打赏
  • 举报
回复
比如存放的内存地址从0000开始
[Quote=引用楼主 freekingdong 的帖子:]
struct s{
byte d; // d ,存放在0000上,满足0000 % 1 = 0,成立
byte w; // w,存放在0001上, 满足0001% 1 = 0,成立
DWORD t; // t,存放在,0002~0005上,满足0002%4 = 0,不成立,所以对其,存放在0004~0007上,
//0000~0007,共8个字节
};

最后其实还是要看s的,由于满足存放地址模对其量,所以不用执行对其操作,最终是8
byte 占一个字节,DWORD 占4个字节 怎么s会是8呢?
[/Quote]
freekingdong 2009-02-28
  • 打赏
  • 举报
回复
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员自身大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
文章出处:http://www.diybl.com/course/3_program/c++/cppxl/2008912/142510.html
sxbwelcome 2009-02-28
  • 打赏
  • 举报
回复
这是字对齐
byte d 虽然理论上占一个字节,但实际上其占两个字节
所以2+2+4=8
freekingdong 2009-02-28
  • 打赏
  • 举报
回复
w为什么会填3个字节呢?
oyljerry 2009-02-28
  • 打赏
  • 举报
回复
struct s{
byte d; //1
byte w; //3
DWORD t; //4
};
字节对齐,d占有1个字节,w填充的时候会填充3个,以满足填满4字节,t占4个字节
dongpy 2009-02-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 freekingdong 的帖子:]
#include <windows.h>
#include <iostream>
using namespace std;
struct s{
byte d;
byte w;
DWORD t;
};
main()
{
struct r;
int a=sizeof(s);
cout < <a < <endl;
}
byte 占一个字节,DWORD 占4个字节 怎么s会是8呢?
[/Quote]
处理器是按总线对齐方式访问内存的,所以编译器对结构体对齐排列,以提高效率。

  • 打赏
  • 举报
回复
struct s{
byte d; [0]
byte w; [1]
DWORD t; [4][5][6][7]这就是字节对齐的原则,DWORD占4字节,就应该从4字节的整数倍位置开始存储
};
楼主都知道这是字节对齐的原则,还这么费解?看注释咯、。
OenAuth.Core 2009-02-28
  • 打赏
  • 举报
回复
附:一定要认真看完,对你受用不尽
OenAuth.Core 2009-02-28
  • 打赏
  • 举报
回复
lingyin55 2009-02-28
  • 打赏
  • 举报
回复
这是字节对齐,一般在结构体里面是根据最长的变量来进行对齐的,除非之前加了设定。

[Quote=引用 2 楼 freekingdong 的回复:]
w为什么会填3个字节呢?
[/Quote]

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧