所以我正在创建一个包含类 someBase {}; 的库。它将由下游用户在多个类中派生。
class someBase {
public:
virtual void foo()=0;
};
我还有一个指向 someBase 的指针向量,我正在这样做:-
vector <someBase*> children;
// downstream user code populates children with some objects over here
for (i=0; i<children.size(); i++)
children[i]->foo();
现在分析表明,对虚拟调用的分支错误预测是我的代码中的一个(几个)瓶颈。我想做的是以某种方式访问对象的 RTTI,并使用它根据类类型对子向量进行排序,以改善指令缓存局部性和分支预测。
关于如何做到这一点的任何建议/解决方案?
要记住的主要挑战是:-
1.) 我真的不知道哪些类或多少类将从 someBase 派生。假设,我可以在某个公共文件的某个地方有一个全局枚举,下游用户可以编辑它以添加他们自己的类类型,然后对其进行排序(基本上实现我自己的 RTTI)。但这是一个丑陋的解决方案。
2.) PiotrNycz 在下面的回答中建议使用 type_info。但是,只有 != 和 == 是为此定义的。关于如何在 type_info 上得出严格的弱排序的任何想法?
3.) 我真的很想改进分支预测和指令缓存局部性,所以如果有替代解决方案,那也将受到欢迎。