打印
[资源共享]

结构体的填充产生的问题

[复制链接]
4923|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

结构体可能产生填充,因为对大多数处理器而言,访问按字或者半字对齐的数据速度更快,当定义结构体时,编译器为了性能优化,可能会将它们按照半字或字对齐,这样会带来填充问题。比如以下两个个结构体:

第一个结构体:

struct {  
     char  c;
     short s;
     int   x;
}str_test1;

第二个结构体:

struct {  
     char  c;
     int   x;
     short s;
}str_test2;

这两个结构体元素都是相同的变量,只是元素换了下位置,那么这两个结构体变量占用的内存大小相同吗?

其实这两个结构体变量占用的内存是不同的,对于Keil MDK编译器,默认情况下第一个结构体变量占用8个字节,第二个结构体占用12个字节,差别很大。第一个结构体变量在内存中的存储格式如下图所示:



第二个结构体变量在内存中的存储格式如下图所示。对比两个图可以看出MDK编译器是是怎么将数据对齐的,这其中的填充内容是之前内存中的数据,是随机的,所以不能在结构之间逐字节比较;另外,合理的排布结构体内的元素位置,可以最大限度减少填充,节省RAM。



使用特权

评论回复
沙发
我想看大海| | 2024-7-31 14:33 | 只看该作者
还真没关注过内存消耗

使用特权

评论回复
板凳
有何不可0365| | 2024-7-31 15:01 | 只看该作者
内存对齐是为了提高内存访问效率,特别是在许多处理器架构中,访问按字或半字对齐的数据比访问未对齐的数据更快。

使用特权

评论回复
地板
yangjiaxu| | 2024-7-31 15:38 | 只看该作者
结构体用好了确实会让程序的架构更加健壮

使用特权

评论回复
5
亚瑟| | 2024-7-31 21:54 | 只看该作者
用结构体可以让变量看着不是很乱

使用特权

评论回复
6
gouguoccc| | 2024-8-1 08:23 | 只看该作者
同一属性得变量勇结构体进行定义和管理比较方便,可读性也更高。

使用特权

评论回复
7
LEDyyds| | 2024-8-14 13:57 | 只看该作者
结构体的填充导致内存不同还真没研究过

使用特权

评论回复
8
shenxiaolin| | 2024-8-30 15:25 | 只看该作者
这个就是结构体,通常情况下都是试用mcmcpy

使用特权

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

本版积分规则

248

主题

1917

帖子

3

粉丝