C# 类实例的内存对齐

C# 类实例的内存对齐,c#,.net,performance,memory-alignment,C#,.net,Performance,Memory Alignment,我最近读到了有关性能的文章 在这里,作者对结构的定义如下: public struct DecisionTreeNode { public short ShortValue; public float FloatValue; public byte ByteVal1; public byte ByteVal2; } 此结构的插入长度为8字节 一切都清楚了,但随后他建议,为了获得性能,作者写道: 这种[内存]对齐问题意味着加载未对齐的值可能会稍微贵一些。幸运的是,修复非常简单,只

我最近读到了有关性能的文章

在这里,作者对结构的定义如下:

public struct DecisionTreeNode
{
  public short ShortValue;
  public float FloatValue;
  public byte ByteVal1;
  public byte ByteVal2;
}
结构的插入长度为8字节

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

这种[内存]对齐问题意味着加载未对齐的值可能会稍微贵一些。幸运的是,修复非常简单,只需交换类定义中字段的顺序

所以他这样做:

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

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

您在这里有一个很好的解释:

所有内容都与Pack字段有关(是其最大元素的大小或指定的packing size属性=>[StructLayout(LayoutKind.Sequential,Pack=X)],以较小者为准)

根据Pack字段,struct将按顺序将字段分组为一个Pack大小,并添加空字节以适应Pack字段

结构=>1byte+8byte+1byte=>Pack字段=>8=>8+8+8=24字节

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


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

我猜,对齐是4字节。在第一种情况下,
short
float
不适合4个字节,但在第二种情况下,最后三个元素完全适合4个字节。