应将不随条件变化的表达式提到if外并用变量缓存;典型错误是重复调用耗时函数或复杂表达式;需警惕带副作用或依赖可变状态的表达式,避免缓存引发bug。

直接结论:把不随条件变化的表达式提到 if 外面,用变量缓存结果。
重复计算在 if 中的典型表现
常见错误是把耗时或逻辑复杂的子表达式反复写在多个分支里,或者在条件判断中重复调用同一函数。比如:
if (expensive_func() > 0 && some_flag) {
result = expensive_func() * 2;
} else if (expensive_func() <p>这里 <code>expensive_func()</code> 被调用了至少 3 次(实际可能更多,取决于短路行为),而它返回值不变——纯属浪费。</p><h3>std::optional 或局部变量缓存更安全</h3><p>不要依赖“只调用一次”的侥幸;显式缓存才是可控做法。推荐两种方式:</p>
- 用普通变量:适合确定一定会计算一次的场景,简洁高效
- 用
std::optional<t></t>:适合“可能不执行”的分支逻辑,避免未初始化风险
示例(普通变量):
auto val = expensive_func(); // 只调用一次
if (val > 0 && some_flag) {
result = val * 2;
} else if (val <p>注意:<code>val</code> 类型要能容纳 <code>expensive_func()</code> 的返回值,必要时加 <code>const</code> 或引用限定。</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/gongju/2823" title="C++14"><img
src="https://img.php.cn/upload/manual/001/431/639/6ac8b33c327c4749.png" alt="C++14" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/gongju/2823" title="C++14" class="overflowclass">C++14</a>
<p class="overflowclass">C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。</p>
</div>
<a rel="nofollow" href="/xiazai/gongju/2823" title="C++14" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div><h3>宏、constexpr 和内联函数不是万能解药</h3><p>有人试图用宏或 <code>constexpr</code> 函数“消除重复”,但容易误判:</p>
- 宏展开后仍可能多次求值,且无类型检查
-
constexpr函数只有在编译期可求值时才真能省掉运行时调用,否则仍是普通函数调用 - 编译器对
inline的决策不可控,不能当作优化承诺
真正起作用的是你写的那行 auto val = ...,不是修饰符。
循环内 if 判断更要警惕
如果 if 在 for 或 while 内部,且条件中含不变量,重复开销会被放大 N 倍:
for (int i = 0; i threshold) { // config.is_debug_mode() 每次都调!
log_debug(data[i]);
}
}
应提前提取:
bool debug_on = config.is_debug_mode();
for (int i = 0; i threshold) {
log_debug(data[i]);
}
}
这种改动成本极低,但对性能敏感路径(如高频循环、嵌入式、游戏 tick)影响显著。
最易被忽略的一点:不是所有“看起来一样”的表达式都等价。比如带副作用的函数(修改全局状态、IO、随机数生成)、或依赖外部可变对象(如 time(nullptr)),缓存前必须确认它真的“不变”。否则,省下的 CPU 时间会换来难以复现的 bug。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










