我有这种架构(简短版本):
class BaseBatch {
virtual ~BaseBatch(){};
};
template<class T>
class Batch : public BaseBatch
{
void draw(T* data) {
do something..
}
};
class BatchManager
{
private:
static std::vector<BaseBatch*> batches;
public:
template <class T>
static void placeData(T* data){
//Loop through the entire container
bool found = false;
for (auto&& b: batches())
if (b->get_type() == typeid(T)) {
dynamic_cast<Batch<T>*>(b)->draw(data);
found = true;
}
//If no bach found, create a new One
if (not found) {
batches.push_back(new Batch<T>);
}
}
};
问题是placeData函数每1个循环被调用多次(多次),我认为动态转换对于性能来说是一个真正的痛苦但是无法弄清楚如何在不使用它的情况下解决这个问题。这真的有问题,或者我不应该为此烦恼并继续使用它?如果我应该避免它,你会建议什么?感谢
答案 0 :(得分:1)
而不是使用std::vector<Batch*>
使用std::unordered_map<std::type_index, std::unique_ptr<BaseBatch>>
。要访问批处理,请使用batches.find(std::type_index(typeid(T)))
,然后static_cast
将其设置为Batch<T>*
。 static_cast
没有运行时开销。要创建新批次,请使用std::type_index(typeid(T))
作为密钥。
dynamic_cast
的表现可能不是问题。事实上,使用此解决方案调用typeid
可能与dynamic_cast
一样糟糕。真正的潜在收益是unordered_map
vs的查找速度,它遍历了谁知道大vector
的每个元素并尝试dynamic_cast
。