C++ 对象化设计模式
一种为 C++ 提供通用对象继承优势的设计模式
引言
C++ 没有全局继承的 Object
类,但是通过 objectify 设计模式,您可以获得类似的结果。
背景
正如任何编程语言中常见的那样,最大的福音通常也是最大的祸根。 在 C++ 中,这以多种形式出现。 其中之一是缺乏全局继承的 object
类,就像 C# 中那样。 这是一大优势,因为不存在与全局继承类相关的开销。 这也是一个弊端,因为它会导致大量重复的类型相关代码。
以 STL 列表或映射为例。 如果有一个全局 Object
类,那么将有一个排序或红黑树的单一实现,它将包含在一个 lib 文件中。 您不会在 .h 头文件中看到大型、复杂的算法,也不会为与映射或列表关联的每种类型重复 10 次相同的算法。
进入 objectify 设计模式。 它保留了 C++ 的优势,即没有(也不需要)一个通用的全局 Object
类,所有其他对象(包括简单类型)都继承自该类。 但是,它仍然允许将类型无关的算法存储在 CPP 文件中并编译成 LIB 文件。 没有次优编译器中的大量内联,也没有 10 次编译相同的方法。
当然,这是有代价的。 正如全局 Object
类的情况一样,类型无关的功能需要虚函数。 当然,这会有相关的开销,通常以 icache 未命中形式出现。
相反,因为您正在为使用映射或列表的所有类型使用单个通用编译函数,所以这也可能导致更少的 icache 未命中。 如果您在短时间内使用不同类型的映射,尤其如此。 当然,最大的好处是您的可执行文件的内存占用量会小得多。 在需要满足此要求的情况下,例如在低内存平台(嵌入式系统、旧游戏机)上进行开发时,好处远远大于弊端。
Using the Code
Objectify
基类很容易从类中使用。 模板化类应该继承自非模板化基类,其中包含大部分功能。 在下面的示例中,我们有一个 _list_base
类,其中包含一个 sort()
函数。
class _list_base
{
protected:
Objectify::Comparable& m_comparable;
_list_base (Objectify::Comparable& comparable) : m_comparable(comparable) {}
public:
void sort ();
};
在 sort
函数中,我们将使用 m_comparable
来安全地比较列表中对象的实例
m_comparable.Compare(node_data(p), node_data(q))
模板化类 list<>
看起来如下
template<typename ListElementType>
class list : protected _list_base
{
public:
list()
: _list_base(Objectify::Typed::Comparable<ListElementType>::s_Comparable)
{
}
}
我们现在有一个类型安全的模板化列表,其中包含类型无关的基类中的通用功能。
zip 文件包含一个功能齐全的列表类,其中包含一个功能齐全的归并排序函数。 享受!
关注点
Objectify
执行复杂算法的方法在速度和占用空间大小之间取得了良好的平衡。 我在 PlayStation 2 上的荣誉勋章游戏中使用类似的方法(使用函数指针而不是 Objectify
)创建了一个简化的 STL 库。 使用此方法而不是标准 STL,占用空间大小显着减小。
历史
- 2009/7/23:首次上传
Objectify
类