调用小型函数两次与存储结果到局部变量:哪种实现方案更优?
关于重复调用函数 vs 存储局部变量的分析
先直接回答你的第一个问题:将函数结果存储到局部变量通常比重复调用函数更可取,尤其是在代码的可维护性和健壮性上优势明显,具体原因我们结合你给出的两个函数实现来拆解。
对比function1和function2的优劣
结合getSomeValue的当前实现,我们来分析两种写法的差异:
function2的潜在问题
虽然现在getSomeValue只是简单的成员访问,看起来两次调用没什么问题,但它存在几个隐藏的隐患:
- 行为不一致风险:如果未来
getSomeValue的实现被修改(比如加入依赖全局状态的逻辑、缓存失效机制,甚至异步操作),两次调用可能返回不同的结果,导致if条件判断和后续调用的逻辑脱节,引入难以排查的bug。 - 不必要的重复开销:即使是小型函数,两次调用也会带来微小的性能损耗(比如重复的空指针检查、成员访问路径)。虽然现代编译器可能会做优化,但依赖编译器优化不如代码本身写得明确可靠。
- 可读性下降:阅读代码的人需要额外确认两次
getSomeValue(param)的调用是完全等价的,增加了理解成本。
function1的核心优势
function1的写法完美规避了这些问题:
- 单一调用,结果稳定:只调用一次
getSomeValue,把结果存储到局部变量中,后续的判断和操作都基于同一个值,逻辑一致且可靠。 - 可读性和可维护性更好:局部变量可以让代码意图更清晰(如果给变量起一个更有意义的名字,比如
targetValue,效果会更好),调试时也能方便地查看这个值。 - 扩展性更强:无论未来
getSomeValue怎么修改,只要它的返回值语义不变,function1的逻辑就不需要调整。
更优的实现方案
在C++17及以后的版本中,我们可以利用if-init语句进一步优化写法,让变量的作用域更紧凑,代码更简洁:
ReturnType* function3(const ParamType* param) { if (const auto value = getSomeValue(param)) { return value->finalStuff(); } return nullptr; }
这种写法的好处是:
- 保留了function1的所有优势(只调用一次函数,结果稳定)
- 变量
value的作用域被限制在if块及其条件判断中,避免了在函数其他地方被误用的可能 - 代码更紧凑,逻辑连贯,不需要额外的行来声明变量
总结
除非你能绝对保证重复调用的函数是无任何副作用的纯函数、重复调用的开销完全可以忽略,且代码可读性不会受影响,否则优先选择将结果存储到局部变量(或使用if-init的紧凑写法)。这种写法不仅更稳妥,也能让代码在未来的维护中更不容易出问题。
内容的提问来源于stack exchange,提问作者Abs
相关产品推荐
相关产品推荐

