结构体大小和对齐值

举报
用户已注销 发表于 2021/11/19 04:36:46 2021/11/19
【摘要】 1,基本变量的大小和对齐值 基本变量的大小就不用说了,char 1 int 4 double 8 等等。 基本变量的对齐值,就是他的大小。 代码: int n; int *p=&n; cout<<p; 输出的值一定是4的倍数,因为int变量的对齐值是4,这样做是为了让数据的处理效率更高,...

1,基本变量的大小和对齐值

基本变量的大小就不用说了,char 1 int 4 double 8 等等。

基本变量的对齐值,就是他的大小。

代码:


  
  1. int n;
  2. int *p=&n;
  3. cout<<p;

输出的值一定是4的倍数,因为int变量的对齐值是4,这样做是为了让数据的处理效率更高,因为计算机是一次读取4个字节的。

也就是说,基本变量的地址,是其对齐值的倍数。

 

2,结构体的大小和对齐值

有3条规则:

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

也可以这么理解:

首先,结构体的对齐值是所有成员的最大对齐值。

其次,结构体的第一个成员的地址必须是结构体的对齐值的倍数,按照“基本变量的地址是其对齐值的倍数”这个原则依次确定每个变量的地址。

最后,结构体的大小是结构体的对齐值的倍数。

 

3,结构体的嵌套

结构体嵌套时,不能按照展开处理,而是把内层的结构体变量当做基本变量,它的大小和对齐值按照上述方法计算。

这个场景让我们更清楚的认识到,结构体成员地址是它的大小的倍数这句话是错的,应该是结构体成员地址是它的对齐值的倍数

 

4,pragma指定对齐值

如果pragma pack指定了对齐值,那么基本变量的对齐值,就是他的大小和指定对齐值中较小的数。

确定了基本变量的对齐值之后,还是按照我上面说的规则确定结构体的大小和对齐值。

 

5,空数组成员


  
  1. struct n1
  2. {
  3. char c;
  4. int x[0];
  5. };
  6. struct n2
  7. {
  8. int c;
  9. int x[0];
  10. };
  11. struct n3
  12. {
  13. char c;
  14. int x[];
  15. };
  16. struct n4
  17. {
  18. int c;
  19. int x[];
  20. };

4个结构体的大小都是4


  
  1. struct n1
  2. {
  3. char c;
  4. char x[0];
  5. };
  6. struct n2
  7. {
  8. int c;
  9. char x[0];
  10. };
  11. struct n3
  12. {
  13. char c;
  14. char x[];
  15. };
  16. struct n4
  17. {
  18. int c;
  19. char x[];
  20. };

4个结构体的大小分别是1 4 1 4

也就是说,空数组是一种大小为0的变量类型,他的对齐值和数组成员的对齐值一样。

 

文章来源: blog.csdn.net,作者:csuzhucong,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nameofcsdn/article/details/105974021

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。