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

    文章

    7329

    浏览量

    128657
  • 字节
    +关注

    关注

    0

    文章

    43

    浏览量

    14330
  • 变量
    +关注

    关注

    0

    文章

    615

    浏览量

    29373

原文标题:字节对齐

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    摩尔线程新一代大语言模型对齐框架URPO入选AAAI 2026

    近日,摩尔线程在人工智能前沿领域取得重要突破,其提出的新一代大语言模型对齐框架——URPO统一奖励与策略优化,相关研究论文已被人工智能领域的国际顶级学术会议AAAI 2026收录。这一成果标志着摩尔线程在大模型基础技术探索上迈出了关键一步,为简化大模型训练流程、突破模型性能上限提供了全新的技术路径。
    的头像 发表于 11-17 16:03 238次阅读
    摩尔线程新一代大语言模型<b class='flag-5'>对齐</b>框架URPO入选AAAI 2026

    MDK uVision V5.36.00使用rt_packed进行字节对齐,但无效,为什么?

    各位RTT专家好: MDK uVision V5.36.00使用rt_packed进行字节对齐,但无效。
    发表于 09-24 06:37

    使用lv_label_set_text释放内存没对齐是什么原因导致的?

    (guider_ui.monitor_label_pressure_now, "1"); rt_mutex_release(lv_mutex); // 释放互斥锁 使用lv_label_set_text导致释放内存没对齐是什么问题 已经加了互斥锁
    发表于 09-16 06:44

    TC334 uart dma发送数据时,只能发送17个字节,怎么解决?

    具体情况:配置串口发送,具体配置情况如下,对于17字节内的数据包能够正常发送,大于17字节的数据包只能发送前17字节。(已做好字节对齐) 请
    发表于 08-04 07:18

    伺服电机编码器与转子磁极相位对齐方法

    永磁交流伺服电机的编码器相位为何要与转子磁极相位对齐 其唯一目的就是要达成矢量控制的目标,使 d 轴励磁分量和 q 轴出力分量解耦,令永磁交流伺服电机定子绕组产生的电磁场始终正交于转子永磁场,从而
    发表于 05-14 16:00

    Allegro Skill布局功能--器件丝印过孔对齐介绍与演示

    Allegro系统虽然提供了基本的元件对齐功能,但其适用范围较为有限。相比之下,Fanyskill 的“对齐”命令在操作体验和功能性上更具优势:其界面设计更加直观易用,并支持多种元素的对齐操作,包括
    发表于 05-14 08:59 2436次阅读
    Allegro Skill布局功能--器件丝印过孔<b class='flag-5'>对齐</b>介绍与演示

    弹性布局 (Flex) 提供更加有效的方式对容器中的子元素进行排列、对齐和分配剩余空间

    弹性布局 (Flex) 弹性布局(Flex)提供更加有效的方式对容器中的子元素进行排列、对齐和分配剩余空间。常用于页面头部导航栏的均匀分布、页面框架的搭建、多行数据的排列等。 布局方向 在弹性
    发表于 04-30 07:54

    PCB布局太乱? Altium Designer这个快捷键帮你一秒对齐全场

    在做PCB设计的时候,你是否也遇到过这种情况: 器件摆好但总感觉歪歪扭扭? 有些元件间距不一致,看着难受? 想对齐又一个个拖动,累得不行? 别急!今天教你一招  Altium Designer 里
    的头像 发表于 04-14 09:09 4303次阅读
    PCB布局太乱? Altium Designer这个快捷键帮你一秒<b class='flag-5'>对齐</b>全场

    图解边沿对齐,中心对齐PWM(可下载)

    在说边沿对齐,中心对齐前,我们先来段铺垫,PWM 又称脉冲宽度调制,我们通过调 节脉冲的占空比,我们可以控制电压的大小(比如我们满占空比时电压为 12V,我们可以通 过调节占空比让电压变为 7V
    发表于 03-31 15:15 1次下载

    伺服电机编码器与转子磁极相位对齐方法

    永磁交流伺服电机的编码器相位为何要与转子磁极相位对齐,其唯一目的就是要达成矢量控制的目标,使 d 轴励磁分量和 q 轴出力分量解耦,令永磁交流伺服电机定子绕组产生的电磁场始终正交于转子永磁场,从而
    发表于 03-03 01:58

    Gerber文件中元件与焊接无法对齐

    同一块板子,转换成Gerber文件后,进行DFM分析时,元件无法与焊接对齐,导致全部贴片元件报错。如果直接采用AD源文件进行DFM分析则不会出现。
    发表于 02-19 09:02

    Orcad绘制原理图的元器件对齐方法

    在使用Orcad软件绘制原理图的时候,为了使原理图绘制的美观一些,有时候也希望像PCB设计一样,将所有的器件都进行对齐,这里我们给大家介绍下,原理图器件对齐的方法,方便大家在原理图设计的时候也可以将元器件进行对齐
    的头像 发表于 02-07 10:33 2584次阅读
    Orcad绘制原理图的元器件<b class='flag-5'>对齐</b>方法

    如何保证电平转换前后数据的相位对齐

    请教各位TI的技术人员一个问题 数据经过电平转换芯片是会产生延迟的 对于多通道电平转换芯片,由于延时的存在,不同通道间的延时是不一样的,同相位的信号经过转换后不同通道的输出信号的相位可能不同,请问一下如何保证不同通道间的输出相位对齐? 谢谢
    发表于 02-05 06:16

    关于tlk2201数据对齐问题求解

    最近在调tlk2201,10bit位宽,tbi模式。目前的进度如下:如果发射端不发k28.5,接收端syncen拉低,是无法对齐的。td0-td9随机对应rd0-rd9。这样不行,所以拉高
    发表于 01-23 06:26

    求助,TLK10002低速侧两路数据对齐的疑问求解

    实际测试tlk10002过程中发现,在开始“同步期间”,也就是tlk10002发送TI专有同步码的过程中,收到的两路同步码是对齐的,数据间没有byte错位。然而,在同步码之后的正常数据,对于两通
    发表于 01-10 06:04