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

    文章

    7453

    浏览量

    129726
  • 字节
    +关注

    关注

    0

    文章

    44

    浏览量

    14414
  • 变量
    +关注

    关注

    0

    文章

    616

    浏览量

    29619

原文标题:字节对齐

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    关于C语言对齐的一些总结

    1. 对齐的目的是什么? 提供访问效率---放大对齐 压缩存储空间---紧凑对齐 2. 对齐的类型有哪些? 自然对齐 :结构体默认按 最大基
    的头像 发表于 05-08 11:23 443次阅读

    使用罗德与施瓦茨ZNH矢量网络分析仪的空中导航ILS系统天线对齐

      在民航业,仪表着陆系统 (ILS) 发射机使用天线阵列指引进场飞机。ILS 性能在很大程度上取决于天线阵列中每个单元的幅度和相位都精确对齐。R&S®ZNH 手持式矢量网络分析仪内置信号源,能够快速方便地在外场测量 ILS 天线系统。
    的头像 发表于 04-02 15:20 151次阅读
    使用罗德与施瓦茨ZNH矢量网络分析仪的空中导航ILS系统天线<b class='flag-5'>对齐</b>

    理连接完成了,时序对齐还没开始

    、G-SYNC,一切参数如预期般呈现。 但深入使用后,你可能察觉: 游戏快速转向时画面有轻微“拖影感”; 视频剪辑时间轴拖动不够跟手; 音画偶尔错位,尤其在高帧率播放时更明显。 物理连接完成了,但信号的时序对齐,其实还没真正开始。 在高速数字显示时代,能否“亮屏”
    的头像 发表于 03-23 17:38 1093次阅读

    伺服电机正余弦编码器的相位对齐方式

    伺服电机正余弦编码器的相位对齐,本质上是为了让编码器反馈的位置信号与电机转子实际的磁极位置(电角度)建立精确的对应关系。这是实现矢量控制、确保电机平稳出力、避免飞车的基础。 根据操作原理和依赖的设备
    的头像 发表于 03-20 15:36 334次阅读
    伺服电机正余弦编码器的相位<b class='flag-5'>对齐</b>方式

    科技云报到:两会“中场时刻”:从技术突破到制度对齐

    科技云报到:两会“中场时刻”:从技术突破到制度对齐
    的头像 发表于 03-06 19:01 1004次阅读

    LAT1185+一个地址未对齐引起的 HardFault 异常应用笔记

    ,则程序运行正常。表面上看,这似乎是 KEIL MDK 的问题,通过分析,导致这个问题的本质原因是内存地址没有对齐引起的,下面章节将详细分析该问题的来龙去脉以及解决方法。
    发表于 01-11 17:28 0次下载

    频谱分析仪与电压探头匹配指南

    如何实现频谱分析仪与电压探头的精准匹配?核心逻辑可概括为“三对齐一适配”——参数对齐、接口对齐、设置对齐+场景适配,最终目标是规避信号反射、衰减与失真问题,确保测量数据(幅度、频率、波
    的头像 发表于 12-29 14:51 673次阅读
    频谱分析仪与电压探头匹配指南

    CW32操作FLASH地址对齐的要求

    地址边界对齐,即使用 16bit 位宽访问 FLASH 时的地址必须是偶地址,使用 32bit 位宽时的地址必须是 4 的倍数地址。 正确地址对齐的代码示例: 8bit 读取: tempdata
    发表于 12-15 06:30

    单片机内部FLASH字节操作

    一个字(32位) [*]// addr:读取地址 [*]// 返回: 读到的字数据 [*]//备注: 地址为4字节对齐
    发表于 11-24 06:40

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

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

    Hardfult对齐异常怎么解决?

    1.使用O3编译,正常运行。 2.使用OZ编译,报UNALIGNED异常。 3.全局使用Oz编译,对ipc.c文件单独O3编译,正常运行。 00> msh >psr: 0x61000000 00> r00: 0x2000bcf6 00> r01: 0x00000000 00> r02: 0x00000204 00> r03: 0x200344ef 00> r04: 0x20002458 00> r05: 0x00000204 00> r06: 0x2003443c 00> r07: 0x2000bcf6 00> r08: 0x2001bbfe 00> r09: 0xdeadbeef 00> r10: 0xdeadbeef 00> r11: 0xdeadbeef 00> r12: 0x00000000 00>lr: 0x0802e0cf 00>pc: 0x0802e0d4 00> hard fault on thread: AutoPilotRun 00> threadpristatusspstack size max used left tickerror 00> ---------------- ---------- ---------- -------------------------- --- 00> AutoPilotRun 1ready0x000001b4 0x00002800 07%0x00000002 000 00> Monitoring5suspend 0x00000064 0x00000200 19%0x00000005 000 00> DynaParam_thread5suspend 0x0000006c 0x00001000 02%0x00000005 000 00> tshell 6ready0x0000004c 0x00002000 03%0x0000000a -02 00> CAN1_MR1suspend 0x00000080 0x00000800 06%0x00000005 000 00> CAN1_MS1suspend 0x00000080 0x00000200 25%0x00000005 000 00> CAN0_MR1suspend 0x00000080 0x00000800 06%0x00000005 000 00> CAN0_MS1suspend 0x00000080 0x00000200 25%0x00000005 000 00> COM2_MR1suspend 0x00000078 0x00000800 05%0x00000005 000 00> COM2_MS1suspend 0x00000078 0x00000800 05%0x00000005 000 00> COM1_MR1suspend 0x00000078 0x00002000 01%0x00000005 000 00> COM1_MS1suspend 0x00000078 0x00001000 02%0x00000005 000 00> COM0_MR1suspend 0x00000078 0x00000800 05%0x00000005 000 00> COM0_MS1suspend 0x00000078 0x00000800 05%0x00000005 000 00> tidle 15ready0x0000005c 0x00000100 35%0x00000004 000 00> timer4suspend 0x00000044 0x00000200 13%0x0000000a 000 00> main4suspend 0x00000064 0x00000800 15%0x00000011 000 00> FPU active! 00> usage fault: 00> SCB_CFSR_UFSR:0x100 UNALIGNED
    发表于 10-13 07:45

    MDK536 + SWM34S平台移植LVGL8.3.3 定义数组使用ALIGN()对齐时编译报错是什么原因导致的?

    使用MDK536 SWM34S单片机 ENV下添加LVGL软件包8.3.3后,编译工程报错。提示出错在定义数组时使用ALIGN字节对齐,在lv_rt_thread_port.c中和一些样例代码文件
    发表于 10-09 08:00

    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