内存对齐的主要作用(原因)
-
1、平台原因(移植原因)
不是所有的硬件平台都能访问任意地址上的任意数据的;
某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。 - 2、性能原因
数据结构(尤其是栈)应该尽可能地在自然边界上对齐。
为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
空间换时间。因为 CPU 在读取内存时,是一块一块的读取。
在C/C++中,struct类型中的成员的一旦声明,则实例中成员在内存中的布局(Layout)顺序就定下来了,即与成员声明的顺序相同,并且在默认情况下总是按照结构中占用空间最大的成员进行对齐(Align);当然我们也可以通过设置或编码来设置内存对齐的方式。
C#也提供了对内存布局方式的修改:StructLayoutAttribute
1.[StructLayout(LayoutKind.Sequential)]
pack为8,会占用24byte的内存。结构体的默认布局方式(与c、c++相同,按min(设置的pack,结构中占用空间最大的成员所占内存)),会按照写入代码的顺序进行对齐,可能会造成一定程度的空间浪费,如果定义的结构体或类与托管代码没有任何交互,最好还是不要使用默认的布局方式,否则就写成默认。
2.[StructLayout(LayoutKind.Explicit)]
会占用9byte的内存,很显然三段数据共享了一部分内存,应该对每个字段编辑正确的[FieldOffset(..)],计算FieldOffset一定要小心。
可以通过对多个字段编辑相同的FieldOffset来实现类似C语言公用体(union)的功能。
3.[StructLayout(LayoutKind.Auto)]
类的默认布局方式,使用这种布局方式会对结构体/类的字段顺序进行调整,使之占尽可能少得内存,并进行4byte的内存对齐。如果与托管代码没有任何交互,尽量将结构体也设置成这个。
官方文档:StructLayoutAttribute 类 (System.Runtime.InteropServices) | Microsoft Learn
标签:LayoutKind,c#,布局,默认,访问,内存,对齐 From: https://www.cnblogs.com/mcyushao/p/17142008.html