c - If 语句与函数指针

标签 c performance if-statement function-pointers data-oriented-design

目标是根据复选框是打开还是关闭来更改事件循环中的行为。我能想到的最简单的方法就是在每次循环运行时测试复选框状态。

// if-statement

void action() { /* ... */ }


void someLoop() {

  if (checkboxTrue) {
    action();
  }
  // ... other stuff

}

如果使用函数指针,代码是否会更高效、更简洁或在其他方面更好?像这样:

// function pointer

void action() { /* ... */ }
void empty() {}
void (*actionPtr)();


void checkboxChanged(int val) {

  if (val == 1)
    actionPtr = &realAction;
  else
    actionPtr = ∅

}

void someLoop() {

  (*actionPtr)();
  // ... other stuff

}

最佳答案

  1. 一个间接函数调用比一个 if 条件调用更昂贵。

  2. 几个 if 条件比间接函数调用更昂贵。

  3. 此时担心速度是没有意义的:
    您正在等待用户的延迟,并且您正在处理他可以查看的内容(即不会有大量的复选框)。在这样的详细级别上优化每秒执行不到一百万次的代码绝对没有意义。

因此,我的建议是:在编写用户界面时,不要再担心 if 或函数调用的成本。只考虑耗时算法中的此类内容。

但是,如果您发现您确实在内部循环中使用了复杂的 if/else 阶梯和/或 switch 语句,那么您可以通过用间接函数调用替换它们来优化。


编辑:
你说你每秒有 600 次检查。假设您只有一个 if 情况要处理(if 更快的情况),您通过不使用函数指针间接寻址可以每秒“节省”大约 6 微秒,即运行时间的 0.0006%。绝对不值得付出努力...

关于c - If 语句与函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20906060/

相关文章:

c - 如何导出变量 [在 Makefile,shell 脚本,...] 中被视为在 C 中定义(作为宏)?

c - 逐字读取没有结尾字符的文件

c - 链表将节点移动到末尾C

asp.net - 在未打开 View 状态的情况下运行 ASP.NET

c - 获取用户输入时出现段错误?

xml - 在 Adob​​e Flex 中解析大型 XML 文件

java - 如何在 1 秒内从 GAE 数据存储中检索大量(>2000)实体?

python - 在django中,我可以在if标签中使用 'as'吗,比如: {% if excessively_verbose. chain_of_long.nested_references as foo%}

excel - 如果#REF!然后隐藏某些行

C# 属性 - 在 setter 访问器中添加逻辑