C++ 用户指定的参数,用于确定在大循环中调用哪个函数

C++ 用户指定的参数,用于确定在大循环中调用哪个函数,c++,optimization,C++,Optimization,我正在开发一个主要有一个大循环(数百万次迭代)的程序。循环中有函数调用,但调用的函数取决于用户指定的参数。因此,一个简单的解决方案是在main中的循环中使用条件语句来检查用户指定的参数(请参见代码片段)。但是,这并不是最好的解决方案,因为我希望我的程序速度更快(优化非常重要)。我也考虑过函数指针和虚拟函数,但就我的目的而言,它们似乎很慢(函数指针是我迄今为止的最佳选择,因为函数无论如何都不能内联,因为要调用的函数是在运行时确定的) 我认为我的问题最好用一个例子来说明,因为我很难用语言来表达: i

我正在开发一个主要有一个大循环(数百万次迭代)的程序。循环中有函数调用,但调用的函数取决于用户指定的参数。因此,一个简单的解决方案是在main中的循环中使用条件语句来检查用户指定的参数(请参见代码片段)。但是,这并不是最好的解决方案,因为我希望我的程序速度更快(优化非常重要)。我也考虑过函数指针和虚拟函数,但就我的目的而言,它们似乎很慢(函数指针是我迄今为止的最佳选择,因为函数无论如何都不能内联,因为要调用的函数是在运行时确定的)

我认为我的问题最好用一个例子来说明,因为我很难用语言来表达:

int func1(params){
  //Do stuff
}

int func2(params){
  //Do other stuff
}

int func3(params){
  //Do different stuff
}    

int main(int argc, char** argv){

  int some_value;

  for(int i = 0; i < 10000000; i++){
    if(argv[1] == option_one){
      some_value += func1(params);
    }

    if(argv[1] == option_two){
      some_value += func2(params);
    }
    if(argv[1] == option_three){
      some_value += func3(params);
    }
  }
}
int func1(参数){
//做事
}
int func2(参数){
//做其他事情
}
int func3(参数){
//做不同的事情
}    
int main(int argc,字符**argv){
int一些_值;
对于(int i=0;i<10000000;i++){
如果(argv[1]==选项1){
某些_值+=func1(参数);
}
如果(argv[1]==选项二){
某些_值+=func2(参数);
}
如果(argv[1]==选项三){
某些_值+=func3(参数);
}
}
}
这感觉像是一个非常常见的问题,那么有没有有效的解决方案

提前谢谢

用另一种方法:

if (argv[1] == option_one){
    for(int i = 0; i < 10000000; i++){
        some_value += func1(params);
    }
} else if (argv[1] == option_two){
    for(int i = 0; i < 10000000; i++){
        some_value += func2(params);
    }
} else if (argv[1] == option_three){
    for(int i = 0; i < 10000000; i++){
        some_value += func3(params);
    }
}

是否所有三个函数都将使用相同数量和类型的参数进行调用?那么一个函数指针表怎么样,在顶部检查一次参数,在表中设置要使用的函数的索引。或者保存一个指向正确函数的指针,以便以后在循环中使用。如果在这三个函数中没有很多事情要做,请将其作为lambda函数。@Someprogrammerdude到目前为止,函数具有相同的参数,我将尝试检查函数指针表的解决方案。@JeJo不幸的是,函数包含很多内容,只有一个参数在argv[]中传递,以确定要调用哪个函数,因此它是argv[0]哈哈,是的,参数会很麻烦:P@user1621127是的,现在我明白了。我误解错了。我有很多这样的函数,超过三个(应该在问题中提到…),所以在第一个解决方案中会有很多冗余代码。第二个看起来更像我想要的东西,但是这样做会有很多开销吗?我今天晚些时候会尝试计时,如果我有一些时间上的空闲,你的热路径就是你的循环,我希望编译器直接在循环中内联
func1
,…,
func3
。如果不使用函数指针,lambda可能会有所帮助(
&func1
->
[](auto&¶ms){return func1(params);}
)。即使你有数百个函数,代码“冗余”也不是一个问题——除非你没有告诉我们关于循环的一切。
template <typename F>
int my_accumulate(F&& f)
{
    int some_value = 0;
    for (int i = 0; i != 10'000'000; ++i) {
        some_value += f(params);
    }
    return some_value;
}
if (argv[1] == option_one){
    some_value = my_accumulate(&func1);
} else if (argv[1] == option_two){
    some_value = my_accumulate(&func2);
} else if (argv[1] == option_three){
    some_value = my_accumulate(&func3);
}