类实例的内存对齐

时间:2019-07-11 05:35:38

标签: c# .net performance memory-alignment

我最近interesting article已阅读过有关性能的信息。

作者在那里定义struct如下:

public struct DecisionTreeNode
{
  public short ShortValue;
  public float FloatValue;
  public byte ByteVal1;
  public byte ByteVal2;
}

struct的共8个字节。

一切都清楚,但是他随后建议为了提高性能,作者写道:

  

此[内存]对齐问题意味着加载未对齐的值可能会贵很多。幸运的是,此修复非常简单,您只需要在类定义中交换字段的顺序即可。

所以他这样做了:

public struct DecisionTreeNode
{
  public float FloatValue;
  public short ShortValue;
  public byte ByteVal1;
  public byte ByteVal2;
}

类中字段的顺序如何影响实例在内存中的存储方式?它如何影响提到的对齐方式?

1 个答案:

答案 0 :(得分:1)

您在这里有很好的解释:

https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.structlayoutattribute.pack?view=netframework-4.7

https://kalapos.net/Blog/ShowPost/DotNetConceptOfTheWeek13_DotNetMemoryLayout

一切都与Pack字段有关(是其最大元素的大小或指定的装箱大小属性=> [StructLayout(LayoutKind.Sequential,Pack = X)]中较小的那个)。

根据Pack字段,该结构会将字段依次分组为Pack大小,并添加空字节以适合Pack字段。

struct => 1byte + 8byte + 1byte => Pack字段=> 8 => 8 + 8 + 8 = 24bytes

struct => 1byte + 1byte + 8byte => Pack字段=> 8 => 8(1 + 1 + 6空字节)+ 8 = 16字节

您总是可以看到使用Pack字段大小对字段进行分组。