我正在研究一个主要有大循环的程序(数百万次迭代).在循环中有函数调用,但调用的函数取决于用户指定的参数.因此,一个天真的解决方案是在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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这感觉就像一个非常普遍的问题,所以有一个有效的解决方案吗?
提前致谢!
从另一个方面做:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
可能为循环创建模板函数以避免重复.
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;
}
Run Code Online (Sandbox Code Playgroud)
然后
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);
}
Run Code Online (Sandbox Code Playgroud)