对象的存储类型,选择什么更好
c++ Storing type of the object, what choice is better?
不使用RTTI,使用虚函数
我遇到了两种不同的常见解决方案来提供对象的类型:
使用虚方法调用并在方法中保留id:
class Base {
public:
virtual ~Base();
virtual int getType() const =0;
};
class Derived : public Base {
public:
virtual int getType() const { return DerivedID; }
};
与内联方法调用和保持id在基类:
class Base {
int id_;
public:
virtual ~Base();
inline int getType() const { return id_; }
};
class Derived : public Base {
public:
Derived() { id_=DerivedID;}
};
一般来说什么是更好的选择,它们的优缺点是什么?
如果您在每个派生类中都选择第二个带有ID的选项,那么您将在创建的每个对象中都有一个额外的成员。如果使用虚函数的第一个选项,虚函数表中将有一个额外的指针,该指针只存在于每个类中,而不是每个对象中。如果类将有多个虚函数,那么第一个选项显然更好。即使不是,我也认为它更符合人们的期望。
根本不需要直接基类或任何基类成员变量的虚拟继承来支持此特性
struct Interface {
virtual void foo() = 0;
virtual int bar() = 0;
};
template<class T>
class Base : public Interface {
public:
int getType() const { return getTypeId(); }
static int getTypeId() { return T::ClassId; }
};
class Derived : public Base<Derived> {
public:
static const int ClassId = DerivedID;
virtual void foo() { }
virtual int bar() { return 1; }
};
用法类似
Derived der;
Interface* iface = &der;
iface->foo();
iface->bar();
查看这里的工作示例。
注意:
这种系统的当前配置中使用的所有类型都需要在编译时众所周知。这并不支持基于插件模式的机制。
好的,我将尝试…
"它们的优缺点是什么?"
您的第一个示例virtual int getType() const =0;
引起额外的处理开销。virtual
函数调用对于CPU来说更难以抢占。这个问题可能是微不足道的。
第二个例子inline int getType() const { return id_; }
导致额外的运行时存储。并且为每个Base
的每个实例存储额外的int
。这也可能是微不足道的。
"一般来说,什么是更好的选择?"
一般情况下,避免过早优化。选择基类中的纯虚函数,因为它的正确性由编译器和运行时强制执行。
相关文章:
- 讨论 - 创建矩阵时的数组与向量的向量 - 什么是最实用的选择
- 在PostgreSQL中根据它们的ID选择大量行的最快方法是什么?
- 当我选择大于 720 的矩阵大小时,程序退出并显示错误代码.可能是什么原因?
- 从长(且合理)稀疏向量中选择随机元素的最有效方法是什么?
- 在 C++14 中,这种 C++17 倍表达的好选择是什么?
- 我什么时候应该选择"shared_ptr"而不是"make_shared"?
- 谷神星求解器:残差函子使用的可变对象是否良好实践?还有什么其他选择
- 我的选择排序功能C 有什么问题
- 将超时值设置为套接字轮询/选择的最佳实践是什么?
- 有什么方法可以让用户选择要输入哪个变量
- 我应该从以下功能中选择什么
- 你会选择什么平台进行黑莓开发
- 选择什么容器来快速搜索/插入大量数据
- 为小循环计数器选择什么数字类型
- Qt保持构建共享构建无论我选择什么选项
- 对象的存储类型,选择什么更好
- 我应该选择什么类型的Visual Studio c++项目来制作基本的unix应用程序?
- 我选择什么项目模板来制作c++ DirectX DLL ?
- 更好的可读性和简单性vs更高的复杂性和编程速度,选择什么
- 在什么情况下,为Qt MinGW或MSVC选择什么编译器