首页 > 系统相关 >c#内存对齐

c#内存对齐

时间:2023-02-21 18:34:49浏览次数:56  
标签:LayoutKind c# 布局 默认 访问 内存 对齐

内存对齐的主要作用(原因)

  • 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

相关文章