在类上有很多方法会增加该类对象的开销吗?

时间:2010-08-09 15:46:16

标签: c# java memory

想象一下,我正在使用一个类从数据库中恢复项目,比如说

class BankRecord {

public int id;
public int balance;

public void GetOverdraft() {
...
}
public void MakeBankrupt(){
...
}

}

现在,如果只有2种方法(如上所述)或100种方法(可能其中一些方法非常大),使用它的性能会怎样。

如果所有方法都在每个对象上,那么实例化数百个这些对象会更糟吗?这适用于c#/ java类型的语言,但对所有语言都知道。

或者,有一个单独的类,对这些对象执行所有操作,并将对象保留为纯数据类是一种好习惯吗?

2 个答案:

答案 0 :(得分:8)

创建对象实例时,运行时不会复制代码。创建实例时,只有成员字段在内存中分配空间。因此,除非您有其他设计理由,否则不应创建“仅限数据”类。

话虽如此,还有其他最佳实践的原因,为什么你可能不想要一个有多种方法的课程(例如God object anti-pattern)。

答案 1 :(得分:5)

没有。在CLR中,对象具有指向该类型的元信息的指针,该信息包括反射和方法表所需的所有内容。无论表中的条目数是多少,在方法表中查找方法实现的开销都是相同的。有关详细信息,请参阅this article。简而言之,所有对象都有8个字节的开销(4个用于类型句柄,4个用于同步块)。

然而,可能更慢的是反射。它只是因为如果你想通过类型的元数据进行枚举,那么如果在该类型中声明了更多的成员,它将会更慢。