【发布时间】:2014-01-21 06:21:54
【问题描述】:
目标是改变事件循环中的行为,具体取决于复选框是打开还是关闭。我能想到的最简单的方法就是在每次运行循环时测试复选框状态。
// 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
}
【问题讨论】:
-
没有。简单就好。如果没有性能问题,请始终选择可读性而不是性能。
-
我会采用第一种方式。它更短,并说明了它的含义。对于如此无关紧要的事情,性能不是问题。
-
您可能会获得相反的效果。可以预测分支并内联函数调用。但是,通过函数指针调用总是会产生间接成本。
-
除了可能调用不确定函数指针的明显错误外,我发现很少使用第二种方法根本。如果检查复选框的状态确实是您应用程序盔甲中的一个性能问题,我很难想象它是多么简单。无论如何,个人资料,个人资料,个人资料......
-
这里我不同意大家的看法,我认为函数指针总体上会更快。不过差别很小。
标签: c performance if-statement function-pointers data-oriented-design