C语言中的结构体的内存对齐方式

零 为什么会遇到内充对齐问题?

在学习CS+ for CC环境下的单片机代码时,遇到这样一个预编译指令:

#param pack

在中文互联网搜索发现,这个指令会改变内存的对齐方式。#param pack指令后会接一个括号,括号内可能有参数,如预编译指令#param pack(n)表示n个字节对齐,n可以取1,2,4,8,16。那么,没有这个括号的#param pack指令是什么意思呢?

找到了CS+ for CC的帮助文档,检索“pack”, 找到了这个网页:

结构体packing

网页解释,#param pack指令与#param unpack是一对,后接结构体定义语句。在#param pack后定义的结构体内存对齐数(The number of alignment for a structure member)置1,#param unpack后置为非1。那么,什么是内存对齐呢?

一 什么是内存对齐

内存对齐(这是一篇外文资料,本部分是翻译改写)

内存对齐是一种让CPU获取内存数据更高效的数据存储方式。举个例子,对而言32位的CPU,把数据用4字节(也就是32bit)为切割单位保存在内存中会更高效。

结构体在内存中占据的地址是连续的,结构体内每个元素都有独立的尺寸、偏移量和对齐。再举个例子,在一个64位的CPU环境下创捷结构体Thesis,看看内存如何分配:

struct Thesis
{
   char *title;//8 bytes
   char *author;//8 bytes
   char *body;//8 bytes
   bool is_published;//1 byte
   bool is_member_only;// 1 byte
   int no_comments;//4 bytes
   int no_claps;//4 bytes
};
如图,char*类型的元素各占8字节,两个bool值占连续的2个字节,紧随其后的2个字节补齐,后接4字节的int,再接另一个4字节的int,接着4字节补齐
如图,char*类型的元素各占8字节,两个bool值占连续的2个字节,紧随其后的2个字节补齐,后接4字节的int,再接另一个4字节的int,接着4字节补齐

默认保存结构体各元素的对齐方式(原文natural alignment)由结构体中占位最大的数据元素的占位决定。比如这里,char* 类型占位最大,为8字节,那么默认对齐方式就是8字节。说得通俗一点,内存会被分割成8字节8字节的小房间,再让数据元素依次住进这些小房间,空位就用数据元素之间的padding补齐。值得注意的是,在2个bool类型的数据后,int类型的数据前,有2个字节的补齐。

二 #param pack的作用

知道了对齐方式的意义,也就知道了,将对齐置1意味着结构体的内存会被分割成1字节为单位的小房间。也就是说,内存利用率最高。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值