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

    文章

    6889

    浏览量

    123708
  • 字节
    +关注

    关注

    0

    文章

    41

    浏览量

    13802
  • 变量
    +关注

    关注

    0

    文章

    613

    浏览量

    28461

原文标题:字节对齐

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

收藏 人收藏

    评论

    相关推荐

    关于tlk2201数据对齐问题求解

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

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

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

    KiCad的对齐工具不好用?

    两个以上对象 时,才可以在右键的菜单中找到它的身影: 如何使用对齐菜单? 经常有小伙伴抱怨 KiCad 的对齐的效果很随机,没有办法按照意图进行对齐操作。真实情况是 KiCad 在执行
    的头像 发表于 12-04 18:15 252次阅读
    KiCad的<b class='flag-5'>对齐</b>工具不好用?

    ARM嵌入式系统中内存对齐的重要性

    做嵌入式系统软件开发,经常在代码中看到各种各样的对齐,很多时候我们都是知其然不知其所以然,知道要做好各种对齐,但是不明白为什么要对齐,不对齐
    的头像 发表于 11-11 17:17 1017次阅读
    ARM嵌入式系统中内存<b class='flag-5'>对齐</b>的重要性

    I2S有左对齐,右对齐跟标准的I2S三种格式,那么这三种格式各有什么优点呢?

    大家好,关于I2S格式,有两个疑问请教一下 我们知道I2S有左对齐,右对齐跟标准的I2S三种格式,那么这三种格式各有什么优点呢? 而且对于标准的I2S格式,32FS传输16bit的数据,48fs传输24bit的数据,最低位会移动到右声道,是否意味着该数据被丢弃了?还是有
    发表于 10-21 08:23

    请问cc3200 i2s怎么设置左对齐或者右对齐模式?

    CC3200 手册 swru367中有提到i2s支持左对齐或者右对齐,但是在sdk提供的api中没有找到如何设置,请问哪位高人知道,请指点一下,谢谢
    发表于 10-21 07:08

    三相三电平逆变器的中心对齐SVPWM实现

    电子发烧友网站提供《三相三电平逆变器的中心对齐SVPWM实现.pdf》资料免费下载
    发表于 10-12 11:25 0次下载
    三相三电平逆变器的中心<b class='flag-5'>对齐</b>SVPWM实现

    OpenAI超级对齐团队解散

    近日,OpenAI的安全主管、“超级智能对齐团队”负责人Jan Leike宣布离职。据悉,Jan Leike与OpenAI高层在公司的核心优先事项上存在长期且难以调和的分歧。
    的头像 发表于 05-20 10:16 494次阅读

    鸿蒙ArkUI开发:【弹性布局(主轴&amp;交叉轴对齐方式)】

    通过justifyContent参数设置在主轴方向的对齐方式,和Row、Column的主轴对齐方式行为一样
    的头像 发表于 05-14 15:33 812次阅读
    鸿蒙ArkUI开发:【弹性布局(主轴&amp;交叉轴<b class='flag-5'>对齐</b>方式)】

    HarmonyOS开发ArkUI案例:【常用布局容器对齐方式】

    基于ArkTS扩展的声明式开发范式,实现Flex、Column、Row和Stack四种常用布局容器对齐方式。
    的头像 发表于 05-08 16:47 1710次阅读
    HarmonyOS开发ArkUI案例:【常用布局容器<b class='flag-5'>对齐</b>方式】

    AN2658中的AD数据对齐错了怎么解决?

    看到 STM8s003 中文资料, 其 应用笔记 AN2658 中的 AD 数据对齐 描述,将左右对齐搞反了。
    发表于 05-06 07:43

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

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

    STM32H操作外部存储器的地址没有对齐怎么解决?

    如下硬件例外中断,查看了一下是给外部SDRAM变量赋值时发生的,汇编指令如下0x800'4e5a: 0x600aSTR R2, [R1] R1的值是0x3004'4036,没有进行4字节对齐,发生这种问题是MPU设置不对吗,还是对编译器的设置不对,还是
    发表于 03-28 07:23

    PSoC Creator有没有内存对齐方式的设置?

    使用PSoC4开发的时候发现ROM不够了,想做下优化,PSoC Creator有没有内存对齐方式的设置,比如说把对齐方式从4Byte改为2Byte?
    发表于 02-18 08:03

    请问PWM波输出方式中的边沿对齐与中心对齐有什么区别呢?

    请问PWM波输出方式中的边沿对齐与中心对齐有什么区别呢?对于PMSM FOC应该使用那种对齐方式呢?为什么呢?
    发表于 02-05 06:06