2016 - 2024

感恩一路有你

内存对齐三原则 内存对齐的目的和规则?

浏览量:1388 时间:2021-03-12 15:53:41 作者:admin

内存对齐的目的和规则?

有四种内存对齐原则:

1)。数据成员对齐规则:结构(或联合)的数据成员。第一个数据成员放置在偏移量为0的位置。之后,每个数据成员存储的起始位置从该成员大小或其子成员大小的整数倍开始(只要该成员有子成员,如数组、结构等)(例如,在32位计算机中int为4字节,则应从4的整数倍地址开始存储)。基本类型不包括struct/class/Uinon。

2) . struct as member:如果一个结构中有一些结构成员,那么应该从结构中“最宽的基本类型成员”的整数倍地址存储结构成员。(结构a包含结构B,而B包含char、int、double和其他元素,那么B应该从8的整数倍存储。)。

3) . 收尾工作:结构的总尺寸,即sizeof的结果,必须是结构内部最大构件的“最宽基本型构件”的整数倍。弥补不足。(基本类型不包括struct/class/Uinon)。

4) . sizeof(Union),结构中最大的元素是Union的大小,因为在特定时间,只有Union的一个成员实际存储在地址中。

为什么C/C 编程语言经常会提到对齐?对齐到底是什么,为什么要对齐,对齐有什么好处?

内存对齐是硬件问题,而不是C/C问题本身。只有C/C能够直接操作内存指针,才有可能对其进行优化。

严格来说,对齐甚至不是CPU问题,而是MMU(内存/缓存)问题。

简而言之,对齐有助于提高缓存利用率。缓存设计时,每行都是一个对齐的空间,如32字节。使用他们的地址低索引。如果读写到与当前缓存线不匹配的地址,则会导致写回并重新加载缓存线。换句话说,有一个性能成本。此外,如果你熟悉芯片设计,你会知道成本是惊人的。许多软件工程师可能没有意识到,在大多数情况下,CPU只有很少的时间来执行指令,而大部分时间是等待缓存。

因此,对于具有性能优化要求的程序,在大多数情况下,内存优化是首要任务。不对齐的内存访问很容易导致此时一次刷新两个缓存,很有可能有用的数据会从缓存中冲出,这不仅增加了此操作的成本,更重要的是,下次必须重新加载清洗后的数据,这是一个很高的成本。更糟糕的是,此操作可能会继续导致新的有用数据在下次被刷新和回收。

据我观察,今天99%的程序员对CPU内存体系结构知之甚少,他们的代码几乎根本不考虑性能。事实上,在大多数情况下这并不重要。不管怎样,剩下的1%做了核心工作。

c语言中变量存储为什么要内存对齐?

为了加快计算机的数据获取速度,编译器将默认处理结构(事实上,其他地方的数据变量也是如此),因此宽度为2的基本数据类型(短等)位于可被2整除的地址,基数数据类型(int,等)位于可被4整除的地址,依此类推。这样,可能需要在两个数字之间添加填充字节,因此整个结构的sizeof值会增加。

字节对齐的细节与编译器实现有关,但一般来说,满足三个标准:1)结构变量的第一个地址可以除以其最宽基本类型成员的大小;2) 结构的每个成员相对于结构的第一个地址的偏移量是成员大小的整数倍。如果需要,编译器将在成员之间添加内部加法;

3)结构的总大小是结构最宽基本类型成员大小的整数倍。如果需要,编译器将在最后一个成员之后添加训练填充。

有人说电脑主机内存条要隔行插,为什么?

计算机内存交错的目的是形成一个双通道。双通道可以将位宽度增加一倍。在同时存储和交换数据时,可以同时与CPU交换两个数据,大大提高了计算机的性能。

交错插件的另一个优点是有利于散热。当你的电脑运行大型游戏或大型应用程序时,当你用手指触摸内存粒子时,你会发现它非常热。其实,隔行插一般是针对有四个插槽的主板,主板会用相同的颜色标记同一组通道内存插槽,只要你按照相同的颜色插就不需要太多的理解。

这里需要提醒的是,即使AMD平台是由两个通道组成的,最好是第1组和第3组,因为如果没有按照主板的要求插上电源,有时系统就无法正常启动。注意这个。

简而言之,交错的主要目的是形成双通道。双通道可以更好地提高电脑的性能,特别是在游戏的情况下。我亲自测试过,在双通道和非双通道的情况下,游戏的平均帧速率可以提高5到10帧。不过,我看到一些帖子提到,有些游戏对双通道特别敏感,可以有近300帧,我不知道这是不是真的。简言之,双通道内存确实可以提高电脑的整体性能。这是真的。

什么是数据的对齐?为什么要对齐?

对齐与内存中数据的位置有关。如果变量的内存地址是其长度的整数倍,则称为自然对齐。例如,在32位CPU中,如果整数变量的地址是0x00000004,则它自然对齐。字节对齐的根本原因是CPU访问数据的效率。假设上面整数变量的地址不是自然对齐的,例如0x00000002,那么CPU需要访问内存两次,如果它接受它的值。第一次从0x00000002-0x00000003取短,第二次从0x00000004-0x00000005取短,然后合并得到所需的数据。如果变量的地址为0x00000003,则需要访问内存三次,第一次访问char,第二次访问简称char,第三次访问char,然后合并得到整数数据。如果变量处于自然对齐位置,则只能检索一次数据。有些系统对对齐非常严格,如SPARC系统。如果数据没有对齐,就会出现错误

内存对齐三原则 c语言如何向右对齐 16位占几个字节

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。