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

    文章

    37

    浏览量

    13412
  • 代码
    +关注

    关注

    30

    文章

    4556

    浏览量

    66805
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48625
  • 结构体
    +关注

    关注

    1

    文章

    125

    浏览量

    10750
收藏 人收藏

    评论

    相关推荐

    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

    为什么ST库函数结构没加对齐地址是连续的?

    为什么ST库函数结构没加对齐,地址是连续的
    发表于 10-15 08:11

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

    01 默认字节对齐 C语言结构字节对齐是老生常谈的问题了,也是高频面试题,现在我们来深入研究这个问题,彻底弄懂到底是怎么回事,给你一个
    的头像 发表于 06-12 17:42 2828次阅读

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

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

    单片机开发重点-字节对齐问题

    (n),C编译器将按照n个字节对齐。使用伪指令 #pragma pack(),取消自定义字节对齐方式。另外,还有如下的一种方式:__attribute((aligned (n))),让
    发表于 11-13 13:06 6次下载
    单片机开发重点-<b class='flag-5'>字节</b><b class='flag-5'>对齐</b>问题

    STM32 终极字节对齐解析

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

    单片机字节对齐

    对齐原则:数据存放的地址需要是其类型长度的整数倍;字节对齐的作用不仅是便于cpu快速访问,同时合理的利用字节对齐可以有效地节省存储空间。许多
    发表于 12-01 15:21 11次下载
    单片机<b class='flag-5'>字节</b><b class='flag-5'>对齐</b>

    什么是结构体的字节对齐现象

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

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

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