【发布时间】:2017-03-31 19:20:28
【问题描述】:
我有这个架构(简称):
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 个循环中被多次调用,我认为动态转换对性能来说是一个真正的痛苦,但不知道如何在不使用它的情况下解决这个问题。真的有那么大的问题还是我不应该打扰它并继续使用它?如果我应该避免它,你会建议什么?谢谢
【问题讨论】:
-
这个设计对我来说看起来很奇怪 - 你不能只用
std::vector<Batch*>代替吗? (或除另一个之外) - 特别是因为dynamic_cast<Batch<T>*>(b)->draw(data);可能导致 UB(因为dynamc_cast可能会返回nullptr如果它无法执行演员表) -
将
BaseBatch中的draw声明为纯虚拟。 -
您“认为”这是性能问题吗?这还不够好。您需要测量,并且需要使用分析器来查看实际 性能问题在哪里。它可能(也可能不是)在您期望的地方;这些事情很棘手;总是测量。
-
@UnholySheep 我不能,因为 Batch 是一个模板类,所以在初始化它之前需要知道一个参数
-
@JesperJuhl 你可能是对的,没有措施我不能 100% 确定,但我想避免动态投射,我只是不喜欢它,直到现在我一直在躲避它成功
标签: c++ templates inheritance polymorphism