内存分配(100分)

  • 主题发起人 主题发起人 谭俊峰
  • 开始时间 开始时间

谭俊峰

Unregistered / Unconfirmed
GUEST, unregistred user!
我想了解以下Delphi是如何分配内存的,
对于一个对象,包括数据和方法,同一种对象,
数据不同而方法相同,
那么Delphi是否会象DLL那样处理同一种类的多个空件呢?
也就是说,空件多了,是否会以为相同的方法而占用大量的内存空间?
 
每个实例都要分配空间。
同种对象的多个实例的方法共用,属性、方法指针、数据不共用。
子类使用父类的方法。
 
如果真的象 zensst 所说的话,我对Booland公司就佩服的五体投地了,
不过目前,我还没有看到书面资料提到此事,
所以我想证实一下,或者看看他人意见。
另外,Another_eYes老兄,
是肯定会占用大量的内存空间,
还是肯定会多个实例的方法共用,
能明确一点好吗?

谢谢。
 
我印象中Delphi的对象方法是公用的, 但数据是独占的, 也就是说每个对象都有它自己
的数据段, 但是代码段是公用的.

Delphi中的对象其实是一个指针, 指向一个称为对象描述表的东西(ODT, 好象是叫这个名字)
这个表中包含了对象实体中的属性(数据), 以及方法的入口(函数地址). 并且总是属性在前,
方法在后. 在表中还包括了一些这个对象所能使用的堆栈段索引(Segment index).
方法的真正代码是在另一个代码段(Code Segment)的.

对一个对象初始化的时候, 调用构造函数(constructor函数, 通常是create), 系统会自动
分配一个ODT大小的空间(a:=TA.create;), 根据构造函数程序在堆栈中分配局部变量的内存,
并对属性进行赋初值, 对重载方法(override)和虚方法(virtual)进行方法指针的"本地化",
对堆栈段初始化.

在析构函数(destructor函数, 通常是Destroy)中则是构造函数的相反过程.

由于调用方法的时候局部变量和对象的属性都是保存在独立的堆栈空间中, 所以同一对象类型
不同实例之间同时调用同一方法也不会有问题的.
 
后退
顶部