保留对象成员变量的本地副本

时间:2017-05-23 04:07:54

标签: c++ optimization

如果我要多次使用该变量,是否值得保留对象成员变量的局部变量?这会减少Getter呼叫的数量,但我觉得这可能没有必要。

实施例

void Foo(Bar b){
  if(b.Dodos() == "skimpy")
    cout << "These Dodos are " << b.Dodos() << endl;
}

假设代码很复杂并且多次调用b.Dodos(),那么保留局部变量会有很大的不同吗?即string bd = b.Dodos()特别是如果可以合理地假设/知道getter只是返回一个成员变量?

(假设这已多次询问,但我无法找到答案)

1 个答案:

答案 0 :(得分:1)

如果成员函数只是返回成员变量,那么您可能无法从将结果分配给局部变量中获得任何好处,尤其是在使用inlining时。如果成员函数做了很多工作,那么保留它的本地副本可以为您带来巨大的性能提升。但是,这仅在函数为pure时才能正常工作。也就是说,如果在使用相同参数调用时它始终返回相同的值。如果该函数既纯粹又昂贵,并且在多个其他函数中调用,您也可以考虑尝试memoization技术。这确保了如果使用相同的参数调用函数,后续调用将仅涉及查找而不是昂贵的计算。

除了效率之外,您应该考虑哪种策略最符合DRY原则,或者如果分配给变量将有助于向下一个阅读代码的人(可能是您将来)展示您的意图。例如,如果您多次使用相同的参数调用函数,您应该问自己,参数是否相同是巧合。如果需要进行更改,该更改是否会以相同方式影响所有呼叫,还是会以不同方式影响呼叫?如果调用都会一起变化,那么分配变量将有助于维护,但如果它们会独立变化,那么变量会使维护更加困难。