【发布时间】:2017-05-09 19:17:24
【问题描述】:
这两个程序中哪个运行得更快?第一个是指向两个重新分配变量的函数的指针数组,第二个是两种情况的切换,以相同的方式重新分配变量。
1:
#include <iostream>
void w (int &z);
void y (int &z);
int main(int argc, const char * argv[]) {
void (*p[2]) (int &a) = {w,y};
int s = 0;
for(int i=0;i<1000;i++) {
p[s](s);
}
return 0;
}
void w (int &z) {
z = 1;
}
void y (int &z) {
z = 0;
}
2:
#include <iostream>
int main(int argc, const char * argv[]) {
int s = 0;
for(int i=0;i<1000;i++) {
switch (s) {
case 0:
s = 1;
break;
case 1:
s = 0;
break;
}
}
return 0;
}
一般来说,如果您在编译时知道根据变量的当前值执行哪些指令,那么如果您使用指向函数的指针数组而不是定义 switch 语句,程序会运行得更快吗?还是 switch 语句更快?还是它们都一样快?
【问题讨论】:
-
您是否已经测量过自己(开启优化级别)?
-
第一个例子让我毛骨悚然......
-
你展示的两个程序并不完全等价,它们没有严格的可比性。
-
switch版本绝对更具可读性,在许多情况下,这比您从第一个版本中获得的(潜在且不保证的)优化收益更重要。 -
在性能方面它们很可能是等效的。优化编译器会将合适的 switch 语句转换为跳转表。
标签: c++ arrays performance switch-statement