在我的应用程序中,我有很多不同的数据类型,例如 Car、Bicycle、Person、...(它们实际上是其他数据类型,但这只是示例)。
由于我的应用程序中也有相当多的“通用”代码,并且该应用程序最初是用 C 编写的,因此指向 Car、Bicycle、Person... 的指针通常作为 void 指针传递给这些通用模块,以及标识的类型,像这样:
Car myCar;
ShowNiceDialog ((void *)&myCar, DATATYPE_CAR);
'ShowNiceDialog' 方法现在使用元信息(将 DATATYPE_CAR 映射到接口以从 Car 中获取实际数据的函数)根据给定的数据类型获取汽车的信息。这样,通用逻辑只需编写一次,而不是每次都为每种新数据类型编写一次。
当然,在 C++ 中,您可以通过使用公共根类来简化此操作,如下所示
class RootClass
{
public:
string getName() const = 0;
};
class Car : public RootClass
{
...
};
void ShowNiceDialog (RootClass *root);
问题是,在某些情况下,我们不想将数据类型存储在一个类中,而是以完全不同的格式存储以节省内存。在某些情况下,我们需要在应用程序中管理数亿个实例,并且我们不想为每个实例创建一个完整的类。假设我们有一个具有 2 个特征的数据类型:
- 一个数量(双精度,8 字节)
- 一个布尔值(1 个字节)
虽然我们只需要 9 个字节来存储这些信息,但把它放在一个类中意味着我们至少需要 16 个字节(因为填充),而使用 v-pointer 我们甚至可能需要 24 个字节。对于数亿个实例,每个字节都很重要(我有一个 64 位的应用程序变体,在某些情况下它需要 6 GB 的内存)。
void-pointer 方法的优点是我们几乎可以在 void-pointer 中编码任何内容,并决定如果我们想要从中获取信息(将其用作真正的指针、索引等)如何使用它,但在类型安全的成本。
模板化解决方案无济于事,因为通用逻辑构成了应用程序的很大一部分,我们不想将所有这些都模板化。此外,数据模型可以在运行时扩展,这也意味着模板将无济于事。
有没有比空指针更好(和类型更安全)的方法来处理这个问题?有没有关于这方面的框架、白皮书、研究材料的参考?