C语言中关于结构体的内存对齐

举报
ReCclay 发表于 2022/02/22 01:56:41 2022/02/22
【摘要】 以前没太总结,今天看飞卡的书偶然看到的一个关于嵌入式C结构体的知识,赶紧来记录下,方便以后忘记了再次查阅。 1、自然对齐 两个原则: 1、各个类型偏移量必须是自身所占字节数的整数倍...

以前没太总结,今天看飞卡的书偶然看到的一个关于嵌入式C结构体的知识,赶紧来记录下,方便以后忘记了再次查阅。


1、自然对齐

两个原则:


1、各个类型偏移量必须是自身所占字节数的整数倍。
(譬如,int占4字节,它的偏移量也必须是4的倍数)


2、总的大小必须为该结构体中最大内存的整数倍,不够需要补充。

对了,忘了解释这个偏移量的概念了。变量的存放地址相对于结构起始地址的偏移量。

单独谈及概念的话,也许比较难受,那么直接上代码吧。


#include <stdio.h>
#include <stdlib.h>


struct MyStruct
{
    double a;
    char b;
    int c;
}mystruct;

int main()
{
    printf("%d\n", sizeof(mystruct));
    return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

答案: 8+1+3+4= 16

这么加,什么意思呢?

莫急,且听我细细道来。

我不是前面说了两条金科玉律了嘛?比照着来。

第一条,每个类型的偏移量是自身所占字节的整数倍。第一个类型是double,偏移量是0,自身所占字节8。符合条件。
然后就是char,自身所占字节1,偏移量8。符合条件。
接着int,自身所占字节4,偏移量为9的话,不符合4的倍数这个条件。
应空出3个字节,让偏移量为12,此时满足4的倍数。

那么此时对应的结果为:8+1+3+4 = 16

对了,还要验证一下是否符合第二条,满足最终答案是最大字节数的整数倍。故答案就是16咯。


那么接下来再看一个:

#include <stdio.h>
#include <stdlib.h>


struct MyStruct
{
    char b;
    double a;
    int c;
}mystruct;

int main()
{
    printf("%d\n", sizeof(mystruct));
    return 0;
}
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

char和double换了一下位置呢,

答案:1+7+8+4+4 = 24

emmm,,, 也许参照前面的你算出的答案可能是20,为啥还要+4啊,别忘了第二条玉律,必须是8的倍数,只能加4。


2、自定义对齐

使用#pragma pack(n),也是两条规矩:

自身所占字节小于n,按照默认的对齐方式

自身索赞字节大于n,那么偏移量必须是n的整数倍。

还不清楚?没关系,看代码!

#include <stdio.h>
#include <stdlib.h>
#pragma pack(push)
#pragma pack(4)

struct MyStruct
{
    char b;
    double a;
    int c;
}mystruct;
#pragma pack(pop)

int main()
{
    printf("%d\n", sizeof(mystruct));
    return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

猜,答案会是多少?

答案: 1+3+8+4 = 16

和刚才的24有区别吧,,

学会了吧,,哈哈哈。。。

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

原文链接:recclay.blog.csdn.net/article/details/79143668

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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