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个字节。