我有一个函数,在典型的程序运行中会执行数亿次。此函数执行某个主要任务,但是,如果用户需要,它应该执行该主要任务的一些细微变化。实现这一点的明显方法是这样的:
void f(bool do_option)
{
// Do the first part
if (do_option)
{
// Optional extra code
}
// Continue normal execution
}
但是,这不是很优雅,因为 do_option
的值在程序运行期间不会改变。 if
语句被不必要地频繁执行。
我通过将 do_option
变成模板参数来解决它。每次我想改变它时,我都会重新编译程序。现在,这个工作流程是可以接受的:我不经常更改这些选项,而且我是唯一的用户/开发人员。不过在未来,这两件事都会发生变化,所以我想要一个带有命令行开关的二进制文件。
问题是:处理这种情况最好或最优雅的方法是什么?我不介意拥有一个包含许多 f
拷贝的大型二进制文件。我可以创建一个从一组命令行参数到要执行的函数的映射,或者可能使用一个开关。但我不想手动维护该 map ——这样的参数可能会超过五个。
顺便说一下,我知道有人会说我过早地进行了优化。没错,我测试过。在我的特定情况下,运行时 if
的性能并不比我的模板构造差多少。这并不意味着我对是否可能有更好的解决方案不感兴趣。
最佳答案
在现代(非嵌入式)CPU 上,分支预测器将足够聪明,可以识别每次都采用相同的路径,因此 if
语句是完全可以接受的(且可读的)处理您的情况的方式。
在嵌入式处理器上,编译器优化应该足够智能,以消除 if
语句的大部分开销。
如果您真的很挑剔,可以使用前面提到的模板方法,并使用 if
语句来选择要执行的函数版本。
关于c++ - 有效处理选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45041897/