代码之家  ›  专栏  ›  技术社区  ›  Ivan G.

c类大小计算

  •  4
  • Ivan G.  · 技术社区  · 15 年前

    在C(.NET)中,方法(虚拟、静态、非虚拟)对类大小的影响到底有多大?

    2 回复  |  直到 15 年前
        1
  •  7
  •   Sam Harwell    15 年前

    每个方法都需要内存来保存其字节代码。对于每个方法,代码只存在一次,对于每个实例,代码不存在一次。

    添加和删除实例方法(虚拟或非虚拟)不会更改已分配对象的大小。这不像C++,在这里添加虚拟方法有时会增加分配对象的大小。与C++一样,静态方法也不会改变分配对象的大小。

    对于泛型方法,它实例化的每一组类型都有一个副本。

    编辑:作为对评论的回应,我将更详细地介绍。

    @理查德:这可能是真的,也可能不是真的(可能会有所不同)。只需要一个IL字节代码的副本。对于开放式构造方法和封闭式构造方法,需要一个方法描述符块,以及对于仍然包含泛型类型参数的已构造实例的描述符(在泛型类型定义的泛型参数化基类型中具有泛型参数的方法)。通常,每个封闭的构造实例(值类型加上一个零或多个引用类型)将保留一份本机代码的副本,但可以是零(不是JIT'D/只是解释)或两个或更多(基线和优化编译器,其中一个或多个调用堆栈自该方法重新编译后没有离开基线版本)使用优化的JIT)。 再次编辑: 您是正确的,因为泛型参数约束只允许对其实例化的所有引用类型复制一个本机代码。

        2
  •  1
  •   Barry Kelly    15 年前

    每个实例的大小取决于类的字段,而不是方法。根据实现细节,实现接口可能会占用实例中的空间(每个接口可能有一个指针大小的槽),但不能保证这样做。

    不过,您很难找到实现定义的行为的“官方引用”,因为将来可能会发生变化。