1.4.4 对象机制
在面向对象的语言(比如C++)中,实现了一系列对象机制,比如对象的构造函数和析构函数等,另外,一些面向对象的编程框架(比如OWL和MFC等)对应用程序创建的每个对象都做了记录和跟踪,这样可以实现对象的合理化管理。
但在C语言中,默认情况下却没有这种机制。为了实现这种面向对象的机制,在Hello China的开发过程中,根据实际需要建立了一个对象框架,来统一管理系统中创建的对象,并提供一种机制,对对象创建时的初始化以及销毁时的资源释放做出支持。
在Hello China开发过程中实现的对象机制,主要思路如下:
(1)每个复杂的对象(简单的对象,比如临时使用的简单类型等不包含在内),在声明的时候,都声明两个函数:Initialize和Uninitialize,其中第一个函数对对象进行初始化,第二个函数对对象的资源进行释放,然后定义一个全局数组,数组内包含了所有对象的初始化函数和反初始化函数;
(2)定义一个全局对象,对系统中所有对象进行管理,这个对象的名字是ObjectManager (对象管理器),该对象提供CreateObject、DestroyObject等接口,代码通过调用CreateObject函数创建对象,当对象需要销毁时,调用DestroyObject函数。
第(1)点很容易实现,只要在声明的时候,额外声明两个函数即可(这两个函数的参数是__COMMON_OBJECT*),声明完成之后,把这两个函数添加到全局数组中(该数组包含了系统定义的所有对象相关信息,比如对象的大小、对象的类型、对象的Initialize和Uninitialize函数等)。
对象管理器ObjectManager则维护了一个全局列表,每创建一个对象,ObjectManager都把新创建的对象插入列表中(实际上是一个以对象类型作为Key的Hash表)。每创建一个对象ObjectManager都申请一块内存(调用KMemAlloc函数),并根据对象类型,找到该对象对应的Initialize函数(通过搜索对象信息数组),然后调用这个函数初始化对象。
对于对象的销毁,ObjectManager则调用对象的Uninitialize函数,这样就实现了对象的自动初始化和对象资源的自动释放。
在Hello China的开发过程中,一直使用这种对象模型。实际上,对象模型不局限于对象的自动初始化和自动销毁,而且还适用于对象枚举、对象统计等具体功能。比如,为了列举出系统中所有的核心线程,可以调用ObjectManager的特定函数,该函数就会列举出系统中的所有核心线程对象,因为ObjectManager维护自己创建的所有对象的列表,而核心线程对象就是使用ObjectManager创建的。