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

Adr*_*ian 0 c++ optimization coding-style

我打算发表一个switch声明,但后来意识到它无法对付一个string.然后我写了一个if/ else if/ else语句,然后意识到我不应该让我的功能这么久.那么我将把函数调用放在每个级联if块的主体中,并认为使用hash_map/ unordered_map到一组函数指针可能更好.

我的问题是:

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

    IIRC,地图应该接近O(1),其中作为级联,如果需要一直向下测试,直到找到匹配为O(N).但是,O(1)在什么时候(N)使用带有字符串键的映射来超越O(N)性质?

  2. 编码风格更好吗?

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

Gab*_*han 5

  1. 取决于很多事情 - 你的表有多大,分支预测器中缓存未命中的性能有多差,你可以首先优化最常见的情况,你的哈希函数的密集程度以及是否缓存是否被缓存,您获得了多少冲突以及如何重新映射这些冲突.它往往是哈希,但可能不适用于某些情况.

  2. 地图更清洁.它更容易理解,并且你不会有人决定在if语句中的15个分支中输入特殊情况逻辑,然后在调试和维护中丢失.