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

Is a calling a function pointer through a hash_map<string, fnPtr> more efficient or better style than multiple if/else if/else statements in C++?

本文关键字:else if 更好 有效 语句 lt 字符串 map hash fnPtr gt      更新时间:2023-10-16

我本来打算做一个switch声明,但后来意识到它不能对string做。于是我写了一个if/else if/else语句,然后我意识到我不应该把我的函数写得这么长。因此,我打算将函数调用放在每个级联if块的主体内,并认为使用hash_map/unordered_map对一组函数指针可能会更好。

我的问题是:

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

    IIRC,映射应该接近O(1),而作为级联if需要一直向下测试,直到找到匹配,因此是O(N)。然而,在什么情况下(什么N),使用带有字符串键的映射,O(1)超越了O(N)的特性?

  2. 是更好的编码风格?

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

  1. 取决于很多事情——你的表有多大,分支预测器中缓存缺失对性能的影响有多严重,你能先优化多少最常见的情况,你的哈希函数有多密集,这些哈希是否被缓存,你得到了多少冲突,以及你如何重新映射这些冲突。它将趋向于哈希,但在某些情况下可能不是。

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

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

我不认为效率会成为任何一种方法的问题,除非你计划有大量的字符串/函数指针(在这种情况下,你的建议是只有可行的选择)。

是更好的编码风格?

我想这么说。它看起来干净多了,而且很容易理解。