在线客服
扫描二维码
下载博学谷APP
扫描二维码
关注博学谷微信公众号
今天和大家分享C/C++难点解疑之内存对齐,本文整理了内存对齐的许多问题并附上答案,希望可以帮到对内存对齐这个知识点还不清楚的小伙伴。

一、为什么要内存对齐?
访问未对齐的内存,处理器要访问两次(数据先读高位,再度地位),访问对齐的内存,处理器只要访问一次,为了提高处理器读取数据的效率,我们使用内存对齐。Windows 默认对齐数为8字节,Linux 默认对齐数为4字节。
使用内存对齐的原因还有平台的原因:不是所有的硬件平台都能访问特定的地址上的任意数据,某些平台只能访问特定的地址上的获取数据,否则会抛出异常。
二、内存对齐原则:
在内存中,编译器按照成员列表分别为 每个结构体变量分配内存,当存储过程中需要对齐的需求时,编译器会在成员之间留下额外的内存空间。如果想要确认结构体占多少存储空间,则使用关键字sizeof查看大小,如果想得知结构体的某个特定成员在结构体的位置,则使用offsetof(头文件stddef.h)
结构体或联合体的数据成员、第一个成员放到0片便宜的地方,以后每个数据成员放到自身对齐的整数倍偏移处。(对齐数是变量自身大小和默认对齐数的较小值)结构体的大小必须是最大对齐数的整数倍。
三、对于结构体字节对齐,有哪些规则?
总体上我们假设结构体起始位置为0x0000,N为设置的n字节对齐,则满足公式0x0000%N==0,来决定结构体成员存储的位置。
1.如果是采用默认对齐规则,需要执行以下的步骤:
(1)结构体的成员的自身对值N(数据类型占有的空间,比如在32位机器下int型为4字节,自身对值为4)需要与存储位置做出判断。若满足“起始位置%N=0”(除了结构体的第一个成员,N也要必须满足>=成员自身对齐值),则把该成员存放在该起始位置。若前一个成员与目前成员的存储位置有一定的距离,则把该距离作为填充空间。
(2)所有结构体的成员都分配完存储位置之后,则还要结构体本身也要进行对齐。结构体本身也要满足“(M+X)%S=0”来进行对齐,其中M+X是整个结构体占有的存储空间大小,M是所有结构体的成员的存储空间大小总和,X是为了满足S的整数倍的填补空间大小,S是就是结构体成员中自身对齐值最大的那个。
四、如果是采用#pragma pack(N)规则,需要执行以下的步骤:
(1)结构体成员的自身对齐值是偏移的量。若满足“起始位置%N=0”(这里N是指定对齐值,即#pragma pack(N)),则可以把该成员存储到该起始位置中,偏移量为该成员的自身对齐值(比如int型自身对齐值为4,占用4个字节的内存位置)。
(2)结构体自身对齐值为该结构体的所有成员自身对齐值中最大的值,但又因为结构体的有效对齐值(即指定对齐值)为N,所以“(M+X)%N=0”,M+X是该结构体存储的空间大小。
五、为什么我的编译器在结构中留下了空洞?这导致空间浪费而且无法与外部数据文件进行“二进制”读写。能否关掉填充,或者控制结构域的对齐方式?
当内存中的值合理对齐时,很多机器都能非常高效地访问。例如,在按字节寻址的机器中,2字节的short int型变量必须放在偶地址上,而4字节的long int型变量则必须存放在4的整数倍地址上。某些机器甚至根本就不能访问没有对齐的地址,因此必须要求所有的数据都正确地对齐。
六、什么叫做位域?
位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几 个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。
以上就是内存对齐的全部问题了,不理解的小伙伴可以收藏起来多看几遍。
— 申请免费试学名额 —
在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!
相关推荐 更多
软件编程入门自学要学什么?零基础小白学习路线
软件编程入门自学要学什么?零基础小白需要从计算机的一些基础原理学起。总体上来看,学习的内容比较多,包括数字电路、计算机组成原理、汇编语言、计算机操作系统、计算机编译原理、离散数学、数据结构与算法、计算机网络等。本文将详细为大家讲讲零基础小白学习路线。
11299
2019-08-30 12:10:47
哪些人不适合自学更适合参加IT培训?
如今,高薪的IT行业是人人都想进入的朝阳产业。一般来讲,非计算机专业的朋友想要进入IT行业,一般都只能通过两个渠道,一是自学,二是参加IT培训。对零基础的初学者来讲,虽说自学出来的求职者确实存在,但是绝大多数的人还是刚适合参加IT培训,原因很简单毕竟自学IT技术的难度毋庸置疑。下面我们将一起来看看哪些人不适合自学更适合参加IT培训。
5127
2020-01-10 20:33:51
如何优化if-else代码结构?
不少人在学习编程的时候都会遇到这样的疑惑:如何优化if-else代码结构?为了解决大家的这个学习障碍,本文以<输出今天为星期几> 来聊聊优化if-else代码结构的具体步骤。虽然每个项目都有不同的复杂情况,但是优化思路和逻辑都是一样,大家掌握了本文优化if-else代码结构的方法就可以举一反三,完成更复杂代码的优化。感兴趣的朋友赶紧看下去吧!
5090
2020-04-03 18:31:48
安卓编程入门学习要具备哪些能力?
随着安卓的不断发展壮大,安坐产品所占的市场份额也在不断扩张,全球安卓设备的使用量也不断提升,这也就导致安卓编程人才的需求量与日俱增,可以看出安卓编程的发展前景十分广阔。所以就有了许多人想要想要去学习安卓编程技术,那么安卓编程入门要具备那些能力,学什么?
4490
2020-06-16 15:53:06
菜鸟学习编程应该从哪里入门?
菜鸟学习编程应该从哪里入门?对于完全零基础的初学者来说,在学习编程之前应该从计算机系统的基础知识学起。即使是很多计算机专业的大学生,一开始也是从了解计算机系统开始的。当然,仅仅靠自学想要掌握IT编程还是很难的,建议大家可以在博学谷学习一下专门针对零基础的免费课程,同时自己跟着动手敲敲代码,学习效果会更好。另外,选择就业班还会有量身定制的学习计划和一对一的在线老师辅导。
7096
2020-07-09 13:00:56
