【问题标题】:Effect of properties or get/set methods on object size属性或 get/set 方法对对象大小的影响
【发布时间】:2013-02-08 03:46:42
【问题描述】:

就对象大小而言,如果公开的属性不代表一个状态,而只是将其 getter 和 setter 调用委托给另一个实体,那么属性如何代替 Get/Set 方法影响对象大小?

例如,考虑以下类:

public class Person
{
   Address _address = new Address();

   public string AddressName
   {
      get{ return _address.Name; }
      set { _address.Name = value; }
   }

   public string GetAddressName(){ return _address.Name; }
   public void SetAddressName(string name){ _address.Name = name; }

}

public Address
{
    public string Name { get; set; }
}

我猜测当创建一个新的 Person 时,CLR 在确定分配多少内存时会考虑 AddressName 属性的潜在大小。但是,如果我公开的只是 Get/Set AddressName 方法,则不会分配额外的内存来满足 AddressName 属性。因此,为了节省内存占用,在这种情况下最好使用 Get/Set 方法。但是,这不会对 Address 类的 Name 属性产生影响,因为正在保留状态。这个假设正确吗?

【问题讨论】:

  • when a new Person is created, the CLR will take into consideration the potential size of AddressName 不会,它会分配足够的空间来存储对字符串的引用。
  • 这是出于好奇吗?如果这是可行的,我不会担心生成的 IL 大小的几个差异(如果有任何差异的话)。
  • @IlyaIvanov,这很奇怪,但我也在努力考虑这个项目的性能。
  • 同意,我错了。我查看了属性public string AddressName 并自动想到string 是一种支持字段。感谢指正
  • 请参阅 Jeffrey Richter 所著的优秀书籍 CLR Via C# 了解全部详情。每个 C# 程序员都应该阅读它。 :)

标签: c# memory-management clr


【解决方案1】:

单个对象的大小不受属性、方法、事件等数量的影响。它影响类型元数据的大小和 JITted 代码 - 但不影响每个对象尺寸。这受实例字段影响。

我猜测当创建一个新的 Person 时,CLR 在确定分配多少内存时会考虑 AddressName 属性的潜在大小。

没有。它查看您的字段。您只有一个字段 (_address),因此加上正常的对象开销是单个实例所需的所有内存。

【讨论】:

    【解决方案2】:

    正如 Jon 已经回答的那样,对象实例的大小由其实例字段确定。不过,让我更详细一点。

    一个对象实例至少与其字段大小的总和一样大。根据字段对齐约束和 CLR(公共语言运行时)布局字段的方式,可能需要考虑一些填充字节。对于引用类型,实例有两个额外的隐藏字段:同步块索引和类型引用。两者都是本机整数。在堆上,实例的最小大小为 12 字节(不管它们实际需要多少空间)。

    以下面的类为例:

    class X
    {
        byte value1;
        string value2;
        int value3;
        long value4;
    }
    

    在 32 位系统上,X 的实例可能需要 28 个字节:

    • 同步块索引和类型引用的 2 乘以四个字节,
    • byte 一个字节,
    • 三个填充字节,用于对齐下一个字段,
    • 四个字节用于对象引用string
    • int 的另外四个字节
    • long 的八个字节,

    如您所见,getter 和 setter、方法和构造函数不会占用每个对象实例中的空间。相反,有一个单独的对象(您知道它为Type)维护方法列表(getter、setter 和构造函数也是方法)并包含该类型的静态字段。您可以根据需要创建任意多个类型的对象实例,但任何给定类型实例都只会有一个 Type 对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      • 2018-08-30
      相关资源
      最近更新 更多