小编a-d*_*dai的帖子

LLVM是避免动态强制转换规则的例外吗?

LLVM拥有自己的RTTI替代方案,这是对内置RTTI的速度提升,并允许动态转换为没有vtable(dyn_cast)的类.但是,它仍然可以完全按照使用的方式dynamic_cast<>使用,尽管它允许它与更多类一起使用.

dyn_cast<> 模板文档

LLVM是一个声誉良好的C++项目,所以这似乎是在面对一个普遍的说法,即太多的动态转换是设计糟糕的标志,也被称为代码气味.当然,性能更好的动态模型无法改善其在设计中的使用,而不是标准dynamic_cast.那么谁在这里?在C++代码中,是否存在大规模使用动态铸造是一个很好的设计选择的情况?谷歌在LLVM中继源代码中出现了690次这种动态转换.

用途dyn_cast<>在LLVM干线

c++ design-patterns dynamic-cast llvm

6
推荐指数
1
解决办法
1314
查看次数

性能:类的向量或包含向量的类

我有一个包含许多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)

c++ arrays performance stl

2
推荐指数
1
解决办法
2428
查看次数

标签 统计

c++ ×2

arrays ×1

design-patterns ×1

dynamic-cast ×1

llvm ×1

performance ×1

stl ×1