我正在开发一个主程序中有大循环的程序(数百万次迭代)。在循环中有函数调用,但调用的函数取决于用户指定的参数。因此,一个天真的解决方案是在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);
}
}
}
这感觉就像一个非常常见的问题,所以有一个有效的解决方案吗?
提前致谢!
答案 0 :(得分:5)
以其他方式做到:
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);
}
}
可能为循环创建模板函数以避免重复。
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);
}