首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类实例的内存对齐

类实例的内存对齐
EN

Stack Overflow用户
提问于 2019-07-11 05:35:38
回答 1查看 189关注 0票数 1

我最近读过关于性能的有趣的文章

在此,作者将struct定义为:

代码语言:javascript
复制
public struct DecisionTreeNode
{
  public short ShortValue;
  public float FloatValue;
  public byte ByteVal1;
  public byte ByteVal2;
}

struct的增量为8个字节。

这一切都很清楚,但随后他建议,为了获得更好的表现,作者写道:

这个内存对齐问题意味着加载非对齐值的代价可能更高。幸运的是,修复非常简单,您只需交换类定义中字段的顺序。

所以他这么做了:

代码语言:javascript
复制
public struct DecisionTreeNode
{
  public float FloatValue;
  public short ShortValue;
  public byte ByteVal1;
  public byte ByteVal2;
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-11 06:51:25

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

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

DotNetMemoryLayout

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

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

结构化=> 1字节+8字节+1字节=>包字段=> 8 => 8+8+8=24字节

结构=> 1字节+1字节+8字节=>包字段=> 8 => 8 (1+1+6空字节)+8= 16字节。

如您所见,始终使用Pack字段大小对字段进行分组。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56982209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档