c++ - 有效处理选项

标签 c++

我有一个函数,在典型的程序运行中会执行数亿次。此函数执行某个主要任务,但是,如果用户需要,它应该执行该主要任务的一些细微变化。实现这一点的明显方法是这样的:

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/

相关文章:

c++ - 在不同的 cpp 文件中使用类对象

c++ - xcb 忽略重复键

c++ - 为基于模板的代码生成更高质量错误消息的工具?

c++ - 一元 * 的冲突类型错误和无效类型参数具有 int

c++ - 尽管有很强的依赖类,但设计灵活

c++ - 是否可以将 forward_list 插入到 unordered_map 中?

c++ - point_types.h 中的 PCL 点云错误

c++ - NuGet 不添加包含目录

c++ - 算术获取 3D vector 中的索引

C++ ofstream : evaluate close() error