OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 15660|回复: 6

结构体对齐问题

[复制链接]

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2013-8-10 13:11:37 | 显示全部楼层 |阅读模式

本来以为自己对结构体对齐还算了解,今天用MDK3.8a写了段测序,结果发现跟自己想像的不太一样。
已知list_s 大小为8.

typedef struct
{
 list_s list;
 u8 type;
 u8 key;

 u8 order;
 u8 attri;

} bcb_bdy_s;

结果sizeof(bcb_bdy_s)  大小为12,跟我想像的一样。

typedef struct
{
 list_s list;
 u8 type;
 u8 key;
} object_s;
typedef struct
{
 object_s o;
 u8 order;
 u8 attri;

} bcb_bdy_s;

结果sizeof(bcb_bdy_s)  大小居然为16。请问这个有什么标准定义的吗?还是编译器的问题?

业余程序玩家。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

25

主题

683

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1351
金钱
1351
注册时间
2012-4-25
在线时间
195 小时
发表于 2013-8-10 14:13:44 | 显示全部楼层
结构体内有 结构体 成员
分别先算 内部结构体变量 大小,如上
object_s o 为 12

则总的 为 16
1-1
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
发表于 2013-8-10 14:16:28 | 显示全部楼层
结构体填充。
https://github.com/roxma
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
发表于 2013-8-10 14:30:35 | 显示全部楼层
1楼正解。
我的理解是,如果 list_s 需要4字节对齐,那么结果就是 bcb_bdy_s 和 object_s 都至少要4字节对齐的,
https://github.com/roxma
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
 楼主| 发表于 2013-8-10 17:37:36 | 显示全部楼层
回复【4楼】Pony279:
---------------------------------
无论哪种写法,就算是package,也可以保证内部结构体的四字节对齐,都可以保证对内部基本类型的存取操作的对齐。或许真如一楼的说法,但想不明白那样有什么好处与必要。
业余程序玩家。
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
发表于 2013-8-11 11:32:01 | 显示全部楼层
回复【5楼】ofourme:
---------------------------------
typedef struct
{
 list_s list;
 u8 type;
 u8 key;
} object_s;
typedef struct
{
 object_s o;
 u8 order;
 u8 attri;

} bcb_bdy_s;

首先,sizeof object_s 必须是12这个没有异议(应为object_s有可能被用来创建数组,本身必须保证对齐),按照你的意思,是希望编译器优化,让bcb_bdy_s也是12吧?
如果优化了,那么带来的问题是:
bcb_bdy_s a;
sizeof(a.o) == ?
sizeof(a.order)==?
sizeof(a.attri) == ?
三个加起来又是?
https://github.com/roxma
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
 楼主| 发表于 2013-8-12 00:50:12 | 显示全部楼层
回复【6楼】Pony279:
---------------------------------
看来应该是为了这个原因。
业余程序玩家。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-15 06:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表