【发布时间】:2017-09-22 03:29:18
【问题描述】:
我目前正在做一个项目,但遇到以下问题。
我有一个 C++ 方法,我想以两种不同的方式工作:
void MyFunction()
{
foo();
bar();
foobar();
}
void MyFunctionWithABonus()
{
foo();
bar();
doBonusStuff();
foobar();
}
而且我不想复制我的代码,因为实际的函数要长得多。 问题是我在任何情况下都不能在调用 MyFunction 而不是 MyFunctionWithABonus 时向程序添加执行时间。这就是为什么我不能只拥有一个通过 C++ 比较检查的布尔参数。
我的想法是使用 C++ 模板来虚拟复制我的代码,但我想不出没有额外执行时间且不必复制代码的方法。
我不是模板专家,所以我可能会遗漏一些东西。
你们有什么想法吗?或者这在 C++11 中是不可能的?
【问题讨论】:
-
请问为什么你不能简单地添加一个布尔检查?如果里面有很多代码,那么简单的布尔检查的开销可以忽略不计。
-
@plougue 分支预测现在非常好,以至于布尔检查通常需要 0 个处理器周期来执行。
-
同意@Dan。如今,分支预测的开销几乎为零,尤其是当您多次进入特定分支时。
-
@Dan:compare-and-branch 充其量仍然是一个宏融合的 uop(在现代 Intel 和 AMD x86 CPU 上),而不是零。根据代码中的瓶颈,解码/发出/执行此 uop 可能会从其他东西中窃取一个周期,就像额外的 ADD 指令一样。此外,仅传递布尔参数并让它占用一个寄存器(或必须溢出/重新加载)是非零数量的指令。希望这个函数内联,所以调用和参数传递的开销不是每次都存在,也许是 cmp+branch,但仍然
-
你是不是先把代码写成易于维护的格式?那么你的分析器是否说分支是瓶颈?您是否有数据表明您花在这个小决定上的时间最好地利用了您的时间?