LLVM拥有自己的RTTI替代方案,这是对内置RTTI的速度提升,并允许动态转换为没有vtable(dyn_cast)的类.但是,它仍然可以完全按照使用的方式dynamic_cast<>使用,尽管它允许它与更多类一起使用.
LLVM是一个声誉良好的C++项目,所以这似乎是在面对一个普遍的说法,即太多的动态转换是设计糟糕的标志,也被称为代码气味.当然,性能更好的动态模型无法改善其在设计中的使用,而不是标准dynamic_cast.那么谁在这里?在C++代码中,是否存在大规模使用动态铸造是一个很好的设计选择的情况?谷歌在LLVM中继源代码中出现了690次这种动态转换.
我有一个包含许多double值的类.这存储在向量中,其中类的索引很重要(它们从其他地方引用).该类看起来像这样:
class A
{
double count;
double val;
double sumA;
double sumB;
vector<double> sumVectorC;
vector<double> sumVectorD;
}
vector<A> classes(10000);
Run Code Online (Sandbox Code Playgroud)
需要尽可能快地运行的代码是这样的:
vector<double> result(classes.size());
for(int i = 0; i < classes.size(); i++)
{
result[i] += classes[i].sumA;
vector<double>::iterator it = find(classes[i].sumVectorC.begin(), classes[i].sumVectorC.end(), testval);
if(it != classes[i].sumVectorC.end())
result[i] += *it;
}
Run Code Online (Sandbox Code Playgroud)
替代方案是代替一个巨大的循环,将计算分成两个独立的循环,例如:
for(int i = 0; i < classes.size(); i++)
{
result[i] += classes[i].sumA;
}
for(int i = 0; i < classes.size(); i++)
{
vector<double>::iterator it = find(classes[i].sumVectorC.begin(), classes[i].sumVectorC.end(), testval);
if(it != classes[i].sumVectorC.end()) …Run Code Online (Sandbox Code Playgroud)