打印

字节对齐问题

[复制链接]
1061|36
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sxy4517|  楼主 | 2020-10-31 15:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
ningling_21| | 2020-10-31 16:03 | 只看该作者
本帖最后由 ningling_21 于 2020-11-4 10:47 编辑

结构体的自身对齐占的字节数;其成员中自身对齐值最大的那个值

使用特权

评论回复
板凳
coody| | 2020-11-2 10:16 | 只看该作者
你是问大小端吗?

使用特权

评论回复
地板
jekey| | 2020-11-2 10:36 | 只看该作者
字节对齐,双字节对齐,四字节对齐,是指存储地址地址。
0,1,2。。。
0,2,4。。。
0,4,8.。。。
主要是有些指令是偶地址访问,在些是四字节地址访问,
另外就是数据存储时的数据结构的问题。

使用特权

评论回复
5
sxy4517|  楼主 | 2020-11-2 12:48 | 只看该作者
coody 发表于 2020-11-2 10:16
你是问大小端吗?

不是,两码事。

使用特权

评论回复
6
sxy4517|  楼主 | 2020-11-2 12:49 | 只看该作者
jekey 发表于 2020-11-2 10:36
字节对齐,双字节对齐,四字节对齐,是指存储地址地址。
0,1,2。。。
0,2,4。。。

是的,遇到了结构体占内存地址的问题。

使用特权

评论回复
7
sxy4517|  楼主 | 2020-11-2 12:49 | 只看该作者
顶一下,大家来讨论下,遇到过什么问题。

使用特权

评论回复
8
jekey| | 2020-11-2 15:13 | 只看该作者
sxy4517 发表于 2020-11-2 12:49
是的,遇到了结构体占内存地址的问题。

编译器缺省有可能会按4字节来分配地址,中间会空出一些位置。如果需要连续,需要加关键字来指定结构体的地址对齐方式。

使用特权

评论回复
9
纪国圣| | 2020-11-2 22:24 | 只看该作者



摘自《C语言深度剖析》

使用特权

评论回复
10
sxy4517|  楼主 | 2020-11-3 08:04 | 只看该作者
纪国圣 发表于 2020-11-2 22:24
摘自《C语言深度剖析》

这本书有电子版本吗?发我一份呗229052950@qq.com

使用特权

评论回复
11
sxy4517|  楼主 | 2020-11-3 08:11 | 只看该作者
还有没有其他人在stm32应用中遇到的其他实质问题。
我来说以一个,定义一个结构体类型的变量:
typedef struct
{
  char a;
  float b;
  }newDateType;
假如变量a在内存中的地址位0的话,b在内存中的地址位4.

使用特权

评论回复
12
popeye021| | 2020-11-3 08:47 | 只看该作者
sxy4517 发表于 2020-11-3 08:11
还有没有其他人在stm32应用中遇到的其他实质问题。
我来说以一个,定义一个结构体类型的变量:
typedef str ...

百度pack关键字的用法就懂了

使用特权

评论回复
13
憨厚诚实大叔| | 2020-11-3 08:55 | 只看该作者
一般在你需要关注字节对齐的时候,直接取消字节对齐就好了

使用特权

评论回复
14
纪国圣| | 2020-11-3 09:32 | 只看该作者
sxy4517 发表于 2020-11-3 08:04
这本书有电子版本吗?发我一份呗

C语言深度剖析.pdf (894.42 KB)

使用特权

评论回复
15
sxy4517|  楼主 | 2020-11-3 10:13 | 只看该作者
憨厚诚实大叔 发表于 2020-11-3 08:55
一般在你需要关注字节对齐的时候,直接取消字节对齐就好了

怎么个取消方法

使用特权

评论回复
16
sxy4517|  楼主 | 2020-11-3 10:14 | 只看该作者

使用特权

评论回复
17
sxy4517|  楼主 | 2020-11-3 10:24 | 只看该作者
请问一下,用STM32CUBEMX生成的程序默认是几字节对齐?

使用特权

评论回复
18
sxy4517|  楼主 | 2020-11-3 10:42 | 只看该作者
http://www.openedv.com/forum.php?mod=viewthread&tid=7415&extra=page%3D1&page=2

搜出了一个陈年老贴,大家看一下吧

使用特权

评论回复
评论
zyj9490 2020-11-3 11:11 回复TA
看M0,M3,M4的IBUS,DBUS,SYSBUS怎么取指,存取RAM就知道了,每取总线操作都是32位,即四个字节,字节地址是控制器完成分拆的。因此,最效率是4整的倍数。 
19
elife| | 2020-11-3 11:01 | 只看该作者
个人理解,主要在有固定地址定义格式的数据,需要强制转换类型的时候,会由于编译器的对齐设置,导致出现错误的地址转换。通讯包,磁盘缓冲等有固定格式定义,缓冲区结构转换时一般可定义单字节对齐。另外由处理器结构导致问题,ARM上出现对齐问题会进入错误。X86会正常运行,效率会低。

使用特权

评论回复
20
sxy4517|  楼主 | 2020-11-3 11:12 | 只看该作者
elife 发表于 2020-11-3 11:01
个人理解,主要在有固定地址定义格式的数据,需要强制转换类型的时候,会由于编译器的对齐设置,导致出现错 ...

您是单片机编程还是上位机编程?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

737

帖子

2

粉丝