问答

汇集网友智慧,解决技术难题

21ic问答首页 - 字节对齐问题

字节对齐 讲解

字节对齐问题

sxy45172020-10-31
有没有大神能用简单通俗的语言讲解一下字节对齐
回答 +关注 15
1347人浏览 28人回答问题 分享 举报
28 个回答
  • #pragma pack(4)   //按4字节对齐,但实际上由于结构体中单个成员的最大占用字节数为2字节,因此实际还是按2字节对齐.

    为什么是最大占用字节数为2字节?有人知道吗?
  • 现在将取消方法公布如下:
    #pragma pack (1)
    typedef struct{
            int a;
            char b;
            double c;
            char d[10];
    }Test_TypeDef;
    #pragma pack ()
    #pragma pack (n)  :n表示使用指定n个字节对齐。

    #pragma pack ():取消自定字节对齐,恢复默认。
  • 需要字节对齐的根本原因在于CPU访问数据的效率问题。假设上面整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果取它的值的话需要访问两次内存,第一次取从0x00000002-0x00000003的一个short,第二次取从0x00000004-0x00000005的一个short然后组合得到所要的数据,如果变量在0x00000003地址上的话则要访问三次内存,第一次为char,第二次为short,第三次为char,然后组合得到整型数据。
    zyj9490 2020-11-4 09:26 回复TA
    @sxy4517 :取变量,地址总线永远把低二位清零。可以看权威指南。 
    sxy4517 2020-11-4 09:13 回复TA
    @zyj9490 :恩 
    zyj9490 2020-11-4 08:50 回复TA
    总线永远取的四个字节,32位ARM,都是通过控制器运算得到非4倍数的变量。 
    zyj9490 2020-11-4 08:49 回复TA
    如果02地址代表一个字节的变量,一次性从00取四个字节,控制器运算成字节变量,如果是半字,还是一样,如果是四字节,要分二次取,第一取从00,取四个字节,第二次从04取四个字节,最后拼成四个字节的变量。 
  • 顶一下,感觉大家讨论的还是不够彻底,例如有些地方为什么用到了8字节对齐?
  • 有没有人知道stm32f429用cubemx生成代码时,怎么看默认是几字节对齐?
  • 憨厚诚实大叔 发表于 2020-11-3 11:32
    一般通讯或者数据存储读取的时候才会关注这个问题,基本都是做结构体指针操作时候才会用得上,结构体取消 ...

    恩,说得对。
  • 21楼说得对。
  • 憨厚诚实大叔说得对,大家看一下。
  • sxy4517 发表于 2020-11-3 10:13
    怎么个取消方法

    一般通讯或者数据存储读取的时候才会关注这个问题,基本都是做结构体指针操作时候才会用得上,结构体取消字节对齐就好了。具体的搜索去
    憨厚诚实大叔 2020-11-3 13:45 回复TA
    @sxy4517 :这个时候取消字节对齐,让他们在内存挨个排着就可以了,莫纠结。 
    sxy4517 2020-11-3 11:46 回复TA
    恩,说得对。我就是在这两个地方遇到了这个问题。一个是往EEPROM存储数据的时候,一个是串口通信的时候。 
123下一页

您需要登录后才可以回复 登录 | 注册