c++ - 通过 hash_map<string, fnPtr> 调用函数指针是否比 C++ 中的多个 if/else if/else 语句更有效或更好?

标签 c++ optimization coding-style

我本来打算做一个 switch 语句,但后来意识到它不能针对 string 完成。所以我写了一个 if/else if/else 语句然后意识到我不应该让我的函数这么长。所以我打算将函数调用放在每个级联 if block 的主体内,并认为使用 hash_map/unordered_map 可能更好到一组函数指针。

我的问题是:

  1. 使用 hash_map 指向要使用的函数并以这种方式调用它会更有效吗?

    IIRC,映射应该接近于 O(1),其中作为级联 if 需要一直向下测试直到找到匹配项,因此为 O(N)。然而,在什么时候(什么 N)O(1) 超过了使用带有字符串键的映射的 O(N) 性质?

  2. 它是更好的编码风格吗?

    由于我正在减少将特定代码封装到更小的函数中,这些函数特定于需要完成的操作,所以我认为这是正确的。我知道这更像是一个意见问题,但作为一个社区,我认为这仍然是一个有效的问题。

最佳答案

  1. 取决于很多因素 - 您的表有多大,分支预测器中缓存未命中对性能的影响有多严重,您可以首先优化最常见的情况,哈希函数的强度有多大是,这些哈希值是否被缓存,你得到了多少次冲突以及你如何重新映射这些冲突。它往往是哈希值,但在某些情况下可能不是。

  2. map 更干净了。它更容易理解,并且您不会让某人决定在 if 语句的 15 个分支中的 1 个中加入特殊情况逻辑,然后在调试和维护中丢失。

关于c++ - 通过 hash_map<string, fnPtr> 调用函数指针是否比 C++ 中的多个 if/else if/else 语句更有效或更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16616919/

相关文章:

c++ - 我无法使用删除功能删除列表中的项目

c++ - 如何修复 tar-bzip2 损坏的源代码编码?

C# XNA 二维轨迹效果优化

python - import 语句是否应该始终位于模块的顶部?

c - 包含给定集合中的所有字符串作为子字符串的最佳字符串

c - c的良好OO命名方案

c++ - 避免在 C++20 中进行互斥函数调用的预处理器

java - 整洁的代码 - 如何破坏返回 String 的方法

c++ - (WIN32 API) 编辑控件样式不适用于 CreateWindowEx 中的 RichEdit