【问题标题】: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++?通过 hash_map<string, fnPtr> 调用函数指针是否比 C++ 中的多个 if/else if/else 语句更有效或更好?
【发布时间】:2013-05-17 19:58:57
【问题描述】:

我打算发表switch 声明,但后来意识到不能针对string 进行声明。于是我又写了一个if/else if/else 声明,然后意识到我不应该把我的函数做这么久。因此,我打算将函数调用放在每个级联 if 块的主体中​​,并认为最好将 hash_map/unordered_map 用于一组函数指针。

我的问题是:

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

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

  2. 编码风格更好吗?

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

【问题讨论】:

  • 在 map 中的检索是 O(log(n)),而不是 O(1)(也许您正在考虑使用 hashmap?)。参见例如cplusplus.com/reference/map/map/find
  • 哦,你是对的。更新问题
  • 你可以使用基类和虚函数来消除对 对的需要吗?
  • @ThomasMatthews:不,它基于解析的数据。这是解析识别点。

标签: c++ optimization coding-style


【解决方案1】:
  1. 取决于很多事情——你的表有多大,分支预测器中缓存未命中的性能损失有多大,你可以首先优化最常见的情况,你的哈希函数有多密集是,以及这些哈希是否被缓存,有多少次冲突以及如何重新映射这些冲突。它往往是哈希,但在某些情况下可能不是。

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

【讨论】:

    【解决方案2】:

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

    我认为这两种方法的效率都不是问题,除非您计划拥有大量的字符串/函数指针(在这种情况下,您的建议是唯一可行的选项)。

    编码风格更好吗?

    我会这么说。它确实看起来更干净,而且很容易理解。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-11
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多