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

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

3天内不再提示

经常听说字节对齐,那什么是对齐?

学益得智能硬件 来源:学益得智能硬件 2023-01-31 15:24 次阅读
在计算结构体长度的时候,我们经常听说字节对齐。那什么是对齐?
如果一个变量在内存中的地址正好是它长度的整数倍,我们就称它为自然对齐。
比如在32位的操作系统中,如果一个整型变量的地址是0x04,那么它就是自然对齐。
3b05c184-a07b-11ed-bfe3-dac502259ad0.png而且操作系统也确实是这么做的,随便定义一个整型变量,打印它的地址,结果一定是4的倍数。
int main()
{
int num;
printf("%p
", &num);
return 0;
}
这样做的根本原因还是为了提高CPU的访问效率。如果一个整型变量存放在0x02地址上,那么CPU首先会读取两个字节的short,再读取后面的两个字节,最后把两个部分合成一个整数,很显然这样的效率会比较低。
3b15559a-a07b-11ed-bfe3-dac502259ad0.png  有了这个基础,我们再来计算结构体的长度,就会简单的多。
struct Test
{
    char ch;
    int num;
    short id;
charc;
};
比如这个结构,char类型占一个字节,int占四个字节,但是num不能直接跟在ch的后面,否则num的地址肯定不是4的整数倍,所以需要在ch的后面空3个字节。
3b256cc8-a07b-11ed-bfe3-dac502259ad0.png
接下来轮到id,在32位系统中short占2个字节,直接跟在num的后面就行。

3b401352-a07b-11ed-bfe3-dac502259ad0.png

最后一个是c,因为只占一个字节,所以直接放在最后就好。

3b50104a-a07b-11ed-bfe3-dac502259ad0.png  那结构体的长度是不是11个字节呢,不是的,结构体的长度一定是最长成员的整数倍,所以在c的后面还空了一个字节,结构体一共占了12字节。
记住几个原则。
一、结构体变量的首地址是最长成员长度的整数倍。比如我们计算的这个结构体,它的首地址一定是4的整数倍。
二、每个成员相对结构体首地址的偏移量,一定是该成员长度的整数倍。
三、结构体的总长度是最长成员长度的整数倍。


四、如果结构体内有成员长度大于处理器的位数,那么就以处理器的位数作为对齐单位,比如在32位操作系统中,double占8字节,我们还是按照4字节为对齐单位。

3b5fe326-a07b-11ed-bfe3-dac502259ad0.png

审核编辑 :李倩


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

    关注

    37

    文章

    6288

    浏览量

    121890
  • 字节
    +关注

    关注

    0

    文章

    37

    浏览量

    13412
  • 变量
    +关注

    关注

    0

    文章

    596

    浏览量

    28112

原文标题:字节对齐

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    求助,关于STM32H7的Cache无效化操作32字节对齐问题求解

    core_cm7.h更新到5.1.1版本后,发现该函数对dsize做了32字节对齐,但是op_addr地址32字节对齐却注释掉了?,图片的这句话是不是说SCB-&gt
    发表于 03-29 06:51

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

    体的默认对齐方式和规则 结构体在Keil Arm工程中的默认对齐方式是根据编译器或者编译器选项来定的。通常情况下,编译器会按照平台的特定对齐方式对结构体进行对齐,这样可以提高内存访问速
    的头像 发表于 01-05 14:40 1172次阅读

    OneLLM:对齐所有模态的框架!

    OneLLM 是第一个在单个模型中集成八种不同模态的MLLM。通过统一的框架和渐进式多模态对齐pipelines,可以很容易地扩展OneLLM以包含更多数据模式。
    的头像 发表于 01-04 11:27 343次阅读
    OneLLM:<b class='flag-5'>对齐</b>所有模态的框架!

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

    嵌套的结构体,字节又是如何对齐的呢 先来看下面的代码 typedef struct stu1 { char ary [ 5 ] ; int a; }stu1; typedef struct stu2
    的头像 发表于 11-20 16:01 249次阅读
    嵌套的结构体 <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>现象

    为何FPU使用float变量地址要4字节对齐

    为何 FPU 使用 float 变量地址要 4 字节对齐
    发表于 10-20 06:53

    一个地址未对齐引起的HardFault异常

    一个地址未对齐引起的 HardFault 异常
    的头像 发表于 09-18 10:57 438次阅读
    一个地址未<b class='flag-5'>对齐</b>引起的HardFault异常

    关于NUC980的网口的发送描述符的缓冲区地址要求4字节对齐的问题

    NUC980的网口的发送描述符的缓冲区地址要求 4字节对齐的问题,因为我用的协议栈里面要求IP数据段4字节对齐,加上以太网14字节,如果发送
    发表于 09-04 06:44

    关于RT_ALIGN_DOWN字节对齐问题

    我在rtdef.h中看到了如下字节对齐的宏定义。 #define RT_ALIGN(size, align)(((size) + (align) - 1) & ~((align
    发表于 08-20 11:43

    C语言结构体对齐介绍

    大家好,我是嵌入式老林,从事嵌入式软件开发多年,今天分享的内容是C语言结构体对齐介绍,希望能对你有所帮助
    发表于 07-11 11:50 611次阅读
    C语言结构体<b class='flag-5'>对齐</b>介绍

    NUC980的网口的发送描述符的缓冲区地址要求4字节对齐的问题求解

    NUC980的网口的发送描述符的缓冲区地址要求 4字节对齐的问题,因为我用的协议栈里面要求IP数据段4字节对齐,加上以太网14字节,如果发送
    发表于 06-27 07:34

    请问NANO100 DMA+串口怎样接收非4字节对齐数据?

    外设宽度8bit,收到非4字节对齐数据,总是被4字节截取,请问有好的思路解决吗?谢谢。 请将DMA的数据宽度设置成8位 这是协议定的有问题么?
    发表于 06-26 07:26

    NUC980的网口的发送描述符的缓冲区地址要求4字节对齐的问题求解

    NUC980的网口的发送描述符的缓冲区地址要求 4字节对齐的问题,因为我用的协议栈里面要求IP数据段4字节对齐,加上以太网14字节,如果发送
    发表于 06-13 07:01

    RISC-V未对齐导致问题案例

    本文介绍未对齐导致问题案例
    的头像 发表于 06-08 10:04 1056次阅读
    RISC-V未<b class='flag-5'>对齐</b>导致问题案例

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

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