当前位置:首页 > 内存 > 正文

单片机结构体内存对齐

  • 内存
  • 2024-05-04 20:40:20
  • 1069

一、有经验的C语言程序常说的“内存对齐”,原因究竟是什么?

在C语言程序开发中,有经验的程序员经常会提到“内存对齐”这个词。其实这也是为什么C语言中一个结构体的大小不等于所有结构体大小之和的原因。成员(为什么C语言结构体的大小不等于其所有成员的大小之和?)那么为什么C语言程序需要“内存对齐”呢?

C语言编译器在处理代码时经常会调整一些变量的内存,但这主要是由于底层处理器的限制所致。对于大多数处理器来说,每次访问的数据越少越好。例如,有些处理器每次访问4个字节的数据,这比访问1个字节的数据效率要高得多。

针对这种情况,一些C语言编译器会调整代码中的变量地址,以便处理器能够更高效地访问这些变量。即使是一些严格的处理器或系统在处理未内存对齐的数据时也可能无法正常运行(例如总线错误)。

现代处理器通常具有多级缓存,并且处理器访问这些缓存中的数据比访问内存中的数据要高效得多(就像处理器访问内存中的数据一样)。内存,比访问磁盘中的数据效率高得多)

正如上面介绍的,一般情况下,CPU往往总是以字大小(32)访问数据,因此如果数据不是内存对齐的,CPU在访问数据时可能需要执行更多的读操作。在此类机器上,读取2字节数据往往比读取4字节数据慢得多。

事实上,本节只是触及了表面。处理器的内存系统比我们在这里讨论的要复杂得多,其含义也更加复杂。但至少我们已经知道,在C程序中坚持内存对齐有很多好处。


二、内存对齐问题1.平台原因(OverrideReasons):并非所有硬件平台都可以访问任何地址上的任何数据,某些硬件平台只能访问某些地址上的某些类型的数据。2.性能因素:数据结构应尽可能在自然边界上对齐。原因是处理器必须进行两次内存访问才能访问未对齐的内存,(如果耦合,CPU不需要部署两个操作字,如果不耦合,则需要访问两个操作字来划分所需的内存地址)

指针的大小。一般来说,一个机器字的大小

用好的语言structlayout工具,可以得到下图

这些类型已经在class、map、interface中给出了,并且具体来说就是macmap函数的返回指针,所以mapAlignment是一个机器术语。把它放在第一位,问题就解决了。

计算机体系结构可能需要固定内存地址;即它是变量地址的倍数,即它是变量类型的固定值。
函数alignnof接受表示任何类型变量的表达式作为参数,并返回以字节为单位的变量(类型)对齐的值。对于变量x:

这是因为它没有在int64bol之后对齐。它是32位对齐的,但不是64位对齐的,因为我们使用的是32位系统,所以它只是两个并排的32位值。

●内存对齐是为了让CPU能够高效地访问内存中的数据
●结构对齐是由类型的大小保证和对齐保证决定的
●如果是地址对齐保证了,T类型对齐保证为n,那么运时每个类型值的地址必须是n的倍数。
●如果结构中的字段太满,可以尝试重新排列它们,使字段放置得更近,减少内存浪费
●应将零大小的字段作为最后一个字段删除。它会破坏内存
●原子到64位字必须确保它们在32位系统上占用8个字节。

内存对齐
doc-pdf