C++ 有效防止重复访问

C++ 有效防止重复访问,c++,C++,我有一个计算乘法累加运算的语句,看起来像这样: return A->set(A->get() + B->get() * C->get()); 现在,A、B和C可能不是唯一的,我想最小化冗余get()s。我唯一能想到的优化方法就是使用 if (A == B && B == C) { double a = A->get(); return A->set(a + a * a); } else if (A == B) {

我有一个计算乘法累加运算的语句,看起来像这样:

return A->set(A->get() + B->get() * C->get());

现在,A、B和C可能不是唯一的,我想最小化冗余
get()
s。我唯一能想到的优化方法就是使用

  if (A == B && B == C) {
    double a = A->get();
    return A->set(a + a * a);
  } else if (A == B) {
    double a = A->get();
    return A->set(a + a * C->get());
  } else if (A == C) {
    double a = A->get();
    return A->set(a + B->get() * a);
  } else if (B == C) {
    double b = B->get();
    return A->set(A->get() + b * b);
  } else {
    return A->set(A->get() + B->get() * C->get());
  }
有没有更有效的方法?把它推广到三个以上的参数怎么样?

假设get()方法相当便宜,最好只执行以下操作:

return A->set(A->get() + B->get() * C->get());
另一种方法只是在代码中插入一组条件跳转,这很容易导致比原始代码更昂贵。

假设
get()
方法的成本确实很高,可以产生可测量的性能差异

double a,b,c;
a = A->get();
b = (B==A?a:B->get());
c = (C==B?b:(C==A?a:c->get()));
return A->set(a+b*c);

您可以将它们存储在地图中。这个解决方案可以很容易地扩展到任意多个指针,但为了具体起见,我在这里使用了三个指针

std::无序映射计算值;
对于(MyType*p:{A,B,C}){
if(computed_values.find(p)=computed_values.end()){
计算的_值[p]=p->get();
}
}
双重结果=计算值[A]+计算值[B]*计算值[C];
A->set(结果);

正如其他人所指出的,请确保您的配置文件确实值得
std::unordered_map
查找的开销。

您能否将它们插入一个强制它们唯一的文件中,然后获取结果条目?这似乎比只处理三个条目的复杂代码更具可扩展性。我想尽量减少冗余的
get()
,但为什么呢?
get
需要很长时间吗?否则你只会让事情变得更糟。我在考虑更少的比较和更干净的代码,以及更少的对
get()
的调用。问题不在于实际的时间安排;这是一个硬件系统的模拟模型,因此呼叫有很大的通信开销。
a
B
C
到底是什么?为什么首先需要这些获得者?特别是,为什么比较这些对象要比使用
get()
更快?这并不能回答这个问题,在我看来,作为一个注释或者根本不发布会更好。它只是说“好吧,也许你根本不需要做你要求的事情!”而不是在做OP要求的事情上取得任何进展。