结构体长度问题?

aa122333 2009-02-28 07:46:29
struct st1
{
char p1;
char p3;
short p2;
int p4;
};

struct st2
{
char p1;
short p2;
char p3;
int p4;
};

哪位知道,为什么sizeof(st1)==12;sizeof(st2)==8???
...全文
225 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovewwy 2009-02-28
  • 打赏
  • 举报
回复
先分配一单位长度(结构体中占内存最多数据类型,如int的长度4),然后在该单位长度中依次为结构中的变量分配空间,直至该单位空间不能再分配完一个完整的变量时为止,就再为该结构体分配另一个单位长度的存储空间。

struct st1 1+1+2+4=8
struct st2 1+1空+2+1+3空+4=12
jakqigle 2009-02-28
  • 打赏
  • 举报
回复
资料:
分析例子B;
struct B
{
char b;
int a;
short c;
};
假 设B从地址空间0x0000开始排放。该例子中没有定义指定对齐值,在笔者环境下,该值默认为4。第一个成员变量b的自身对齐值是1,比指定或者默认指定 对齐值4小,所以其有效对齐值为1,所以其存放地址0x0000符合0x0000%1=0.第二个成员变量a,其自身对齐值为4,所以有效对齐值也为4, 所以只能存放在起始地址为0x0004到0x0007这四个连续的字节空间中,复核0x0004%4=0,且紧靠第一个变量。第三个变量c,自身对齐值为 2,所以有效对齐值也是2,可以存放在0x0008到0x0009这两个字节空间中,符合0x0008%2=0。所以从0x0000到0x0009存放的 都是B内容。再看数据结构B的自身对齐值为其变量中最大对齐值(这里是b)所以就是4,所以结构体的有效对齐值也是4。根据结构体圆整的要求, 0x0009到0x0000=10字节,(10+2)%4=0。所以0x0000A到0x000B也为结构体B所占用。故B从0x0000到0x000B 共有12个字节,sizeof(struct B)=12;其实如果就这一个就来说它已将满足字节对齐了, 因为它的起始地址是0,因此肯定是对齐的,之所以在后面补充2个字节,是因为编译器为了实现结构数组的存取效率,试想如果我们定义了一个结构B的数组,那 么第一个结构起始地址是0没有问题,但是第二个结构呢?按照数组的定义,数组中所有元素都是紧挨着的,如果我们不把结构的大小补充为4的整数倍,那么下一 个结构的起始地址将是0x0000A,这显然不能满足结构的地址对齐了,因此我们要把结构补充成有效对齐大小的整数倍.其实诸如:对于char型数据,其 自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,这些已有类型的自身对齐值也是基于数组考虑的,只 是因为这些类型的长度已知了,所以他们的自身对齐值也就已知了.
aa122333 2009-02-28
  • 打赏
  • 举报
回复
哦,谢谢
night_blue 2009-02-28
  • 打赏
  • 举报
回复
这个应该与编译器的内存对齐规则用关系,换个编译器换个系统得到的结果很可能就不一样了。
你可以使用伪指令 #pragma pack()按照自己的需要对齐内存
aa122333 2009-02-28
  • 打赏
  • 举报
回复
short p2; [3][4]
int p4; [5][6][7][8]
那请问这里的起始位置3为什么不是4,不是2的整数倍吗
还有5为什么不是8,4的整数倍啊???
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 aa122333 的回复:]
不懂,那为什么
int p4; [5][6][7][8]
5不是4的整数倍
[/Quote]
汗,我打错了。。
struct st1
{
char p1; [0]
char p3; [1]
short p2; [2][3]
int p4; [4][5][6][7]
};
楼主很细心的说,我刚才打字快了点。
szqh97 2009-02-28
  • 打赏
  • 举报
回复
1楼的很清楚了啊
petera 2009-02-28
  • 打赏
  • 举报
回复
结构体和类都有字节对齐,数剧写的顺序不同,占的内存可能不同,所以写结构体和类时最好同类形的写在一齐如第一种那样
aa122333 2009-02-28
  • 打赏
  • 举报
回复
不懂,那为什么
int p4; [5][6][7][8]
5不是4的整数倍
oyljerry 2009-02-28
  • 打赏
  • 举报
回复
内存对齐除了要考虑各种类型变量所占空间,还要考虑编译器默认的4字节对齐格式,在这个条件下,为了节省空间,编译器会尽可能把能在4字节放得下的前后变量放在一起。理解了这个就知道为什么两个结构体大小为什么不一样了
Andydanlin 2009-02-28
  • 打赏
  • 举报
回复
自己对齐!
aa122333 2009-02-28
  • 打赏
  • 举报
回复
上边的不好意思打错了
应该是为什么sizeof(st1)==8;sizeof(st2)==12???
  • 打赏
  • 举报
回复
你发错了。sizeof(st1)==8;sizeof(st2)==12
自己查查字节对齐的规则
struct st1
{
char p1; [0]
char p3; [1]
short p2; [3][4]
int p4; [5][6][7][8]
};

struct st2
{
char p1; [0]
short p2; [2][3] //占2字节,起始地址要是2个整数倍
char p3; [4]
int p4; [8][9][10][11] //4字节,起始地址是4的整数倍
};

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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