0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

嵌套的结构体 字节是如何对齐的

麦辣鸡腿堡 来源:轩哥谈芯 作者:义轩 2023-11-20 16:01 次阅读

嵌套的结构体,字节又是如何对齐的呢

先来看下面的代码

typedef structstu1{    char   ary[5];    int    a;}stu1;
typedef structstu2{ double a; char b;}stu2;
typedef structstu3{ stu1 s; char str;}stu3;
typedef structstu4{ stu2 s; char str;}stu4;
LOG_INFO("rnrn====== Struct Test ======rnrn");LOG_INFO("sizeof(stu1) :t%dn",sizeof(stu1)); LOG_INFO("sizeof(stu2) :t%dn",sizeof(stu2)); LOG_INFO("sizeof(stu3) :t%dn",sizeof(stu3));LOG_INFO("sizeof(stu4) :t%dn",sizeof(stu4));

图片

在上面的运行结果中,stu1和stu2所占内存的分别为12字节和16字节,对这两者的分析与前面相同。

我们重点看一下这里的stu3和stu4。

在默认情况下,结构体采用该结构体中占用内存最大的类型所占的字节数作为字节对齐方式,但是在stu3中定义的stu1结构体类型的变量s占用16字节,而stu3并不是按照16字节进行对齐的,而是采用4字节对齐,这是因为stu1和stu3中占用内存最大的是int型变量,占用4字节。因此在分析结构体字节对齐方式时需要将结构体分解为“原子类型”,如int、double、char、float、short等,而不是自定义的结构体类型。

找出分解出来的“原子类型”中占用内存最大的类型,将其占用的内存值作为结构体的默认字节对齐值。

在stu4中定义了stu2类型的结构体变量s,按照上面的方法先对stu2进行分解。分解出来的类型有double、char,stu4中还有char类型,其中占用内存最大的是double类型,占用内存大小为8字节,由此可知,stu4采用8字节对齐。

由于stu4中的stu2结构体类型变量s所占用的内存大小为16,而接下来定义了一个char类型的str变量,其偏移地址为16,占用一个字节,此时stu4占用的内存大小为17,不是字节对齐数8的整数倍,所以在stu4占用的内存的最后添加7字节的空间,使其占有内存大小为24。

需要注意,编译器添加的内存并没有使用,没有存放任何有意义的内容。

在结构体的嵌套中,不管遇到多少层的嵌套,都可以按照这种分解方法,对结构体进行逐层分解,再根据分解出来的“原子类型”分析结构体的字节对齐方式.

看下面的例子,会更清楚一些

typedef structstu2{    char   a;    short  c;    int  d;    int  b;
}stu2;
typedef structstu4{ stu2 s; char str; double h;}stu4;
LOG_INFO("offset_of(stu4,s):t%dn",offset_of(stu4,s));LOG_INFO("offset_of(stu4,str):t%dn",offset_of(stu4,str));LOG_INFO("offset_of(stu4,h):t%dn",offset_of(stu4,h));

图片

在 stu2 中,a 的偏移地址为 0,c 的偏移地址为 2,d 的偏移地址为 4,b 的偏移地址为 8。这里的变量 a,c,d 组成第一个对齐单元,变量 b 会和 stu4 中的 str 组合成一个对齐单元。

套在 stu4 中以后,str 的起始地址就为 12,这里,stu2 的 b 和 stu4 的 str 共同组成了第二个 8 字节的对齐单元。

最后一个对齐单元是 double 类型的 h 变量。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 字节
    +关注

    关注

    0

    文章

    39

    浏览量

    13717
  • 代码
    +关注

    关注

    30

    文章

    4741

    浏览量

    68323
  • 编译器
    +关注

    关注

    1

    文章

    1618

    浏览量

    49043
  • 结构体
    +关注

    关注

    1

    文章

    129

    浏览量

    10832
收藏 人收藏

    评论

    相关推荐

    C语言-结构对齐详解

    ", sizeof (struct mystruct1));// sizeof (struct mystruct1) = 8} 分析:整个结构变量4字节对齐是由编译器保证
    发表于 07-12 16:41

    RM48HDK平台CCS结构字节对齐总是咨询

    硬件平台:RM48HDK  软件平台:5.4.0.00091  编译器:TI V5.0.6 我在程序中想对一个结构增加单字节对齐属性,增加方式如下: 1、参照《ARM Optimiz
    发表于 05-25 10:38

    CCS3.3 结构成员对齐

    : expected a type specifier error: expected a ";" 这个错误。是CCS3.3编译器本身不支持__packed这种结构成员的对齐方式
    发表于 06-21 10:16

    请问在ccs4.2 中怎么设置结构字节对齐

    请问在ccs4.2 中怎么设置结构字节对齐,用于网络数据发送的。是:]__attribute__((packed))还是:#pragma pack(1)编译后,两种都不行,是什么原
    发表于 08-02 07:47

    请问z-stack结构默认对齐方式是一字节吗?

    z-stack的结构默认对齐方式是一字节吗?在z-stack中可以将一般指针强制转换为结构
    发表于 08-18 07:38

    请问cc2640r2 ccs7.4结构字节能实现对齐吗?

    请问结构字节下面能实现字节对齐么#pragma pack(1)typedef struct [ uint16_t nt ; uint8_t
    发表于 10-31 10:10

    STM32终极字节对齐的相关资料推荐

    字节对齐。uint64_t定义变量地址要8字节对齐。指针变量是4字节对齐。二、
    发表于 12-06 06:03

    解析C语言结构字节如何对齐

    01 默认字节对齐 C语言结构字节对齐是老生常谈的问题了,也是高频面试题,现在我们来深入研究这
    的头像 发表于 06-12 17:42 3035次阅读

    C语言中Linux字节对齐的问题

    ,于是经过排查,是因为传递消息的结构没有考虑字节对齐的问题。 随手整理一下C语言中字节对齐的问
    的头像 发表于 08-16 11:25 2440次阅读
    C语言中Linux<b class='flag-5'>字节</b><b class='flag-5'>对齐</b>的问题

    STM32 终极字节对齐解析

    字节对齐。uint64_t定义变量地址要8字节对齐。指针变量是4字节对齐。二、
    发表于 11-23 18:06 11次下载
    STM32 终极<b class='flag-5'>字节</b><b class='flag-5'>对齐</b>解析

    结构对齐理解上有点偏差

    总结一下: 结构对齐不再是简单的字节个数的拼凑,而是要与内存地址进行挂钩~一般我们也可以理解为内存地址分配是多少字节的倍数,就是多少直接
    的头像 发表于 08-10 18:08 1173次阅读
    对<b class='flag-5'>结构</b><b class='flag-5'>体</b>的<b class='flag-5'>对齐</b>理解上有点偏差

    结构对齐为什么那么重要?

    以前我也没觉得懂得这个结构对齐或者内存对齐有多重要,直到已经从事了嵌入式开发经验不断积累,才慢慢体会到,这是一种很基础的知识,就因为这个东西不常用,而出现相关的问题是非常致命的,排查
    的头像 发表于 04-03 10:13 1352次阅读

    为什么要结构对齐?为什么结构对齐那么重要?

    C语言结构对齐问题,是面试必备问题。我参与招聘技术面试的时候,也喜欢问这个技术点。
    的头像 发表于 05-26 14:10 1181次阅读
    为什么要<b class='flag-5'>结构</b><b class='flag-5'>体</b><b class='flag-5'>对齐</b>?为什么<b class='flag-5'>结构</b><b class='flag-5'>体</b><b class='flag-5'>对齐</b>那么重要?

    什么是结构字节对齐现象

    什么是结构字节对齐现象 程序员,咱都用代码说话,先上 code: (说明:以下代码均在 ARM 平台上,使用 Keil 进行编译测试) # define offset_of (TY
    的头像 发表于 11-20 15:55 577次阅读
    什么是<b class='flag-5'>结构</b><b class='flag-5'>体</b>的<b class='flag-5'>字节</b><b class='flag-5'>对齐</b>现象

    keil arm工程中结构1字节对齐如何实现

    的默认对齐方式和规则 结构在Keil Arm工程中的默认对齐方式是根据编译器或者编译器选项来定的。通常情况下,编译器会按照平台的特定对齐
    的头像 发表于 01-05 14:40 3463次阅读