Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用开关或定义函数数组-哪个更快?_C++_Arrays_Performance_Switch Statement - Fatal编程技术网

C++ 使用开关或定义函数数组-哪个更快?

C++ 使用开关或定义函数数组-哪个更快?,c++,arrays,performance,switch-statement,C++,Arrays,Performance,Switch Statement,这两个程序中哪一个运行得更快?第一个是指向重新分配变量的两个函数的指针数组,第二个是以相同方式重新分配变量的两种情况的切换 1: #包括 无效w(int&z); 空y(int&z); int main(int argc,const char*argv[]{ void(*p[2])(int&a)={w,y}; int s=0; 对于(inti=0;i来说,switch语句会更快,而且更容易理解。至少在这种情况下是这样。在大多数情况下也是如此 在这种情况下,它会更快,因为编译器可以完全删除整个循环。

这两个程序中哪一个运行得更快?第一个是指向重新分配变量的两个函数的指针数组,第二个是以相同方式重新分配变量的两种情况的切换

1:
#包括
无效w(int&z);
空y(int&z);
int main(int argc,const char*argv[]{
void(*p[2])(int&a)={w,y};
int s=0;

对于(inti=0;i来说,
switch
语句会更快,而且更容易理解。至少在这种情况下是这样。在大多数情况下也是如此

在这种情况下,它会更快,因为编译器可以完全删除整个循环。很明显,所有代码只对局部变量有影响,因此可以在不改变程序可观察行为的情况下消除

这突出说明了为什么
switch
语句通常会更快。如果有很多情况,它将使用跳转表实现,编译器可以随时掌握所有信息,并且可以使用各种技巧删除代码或出于速度原因移动代码

对于函数指针版本,编译器必须足够聪明,以意识到您正在使用函数指针初始化数组,然后从不更改数组或将其地址传递给任何其他对象,以便任何其他对象都可以更改数组。然后,编译器还必须查看所有被调用的函数,并意识到它们对任何对象都没有影响正在传递的引用。这是一个需要询问的问题


更糟糕的是,函数指针的版本真的很难让人理解。如果你不关心这个问题,为什么不用汇编语言或(更好的)语言编写呢在原始处理器操作码中?

我认为switch语句会更快,因为函数指针具有查找函数和函数调用的开销。一个开关只是一个跳转表而已。

您是否已经测量过自己(启用了优化级别)?第一个例子有点让我毛骨悚然……你展示的两个程序并不完全相同,它们没有严格的可比性。
switch
版本绝对更具可读性,这在许多情况下比(潜在的和不保证的)更重要您可以从第一个版本中获得优化收益。它们很可能是等效的、性能方面的。优化编译器会将合适的switch语句转换为跳转表。
#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;
}
#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;
}