C++ C++;为有限数量设置的所有变体编译代码

C++ C++;为有限数量设置的所有变体编译代码,c++,architecture,static-compilation,C++,Architecture,Static Compilation,例如,函数void Func(long param1、long param2、long param3、long param4、long param5)中有硬逻辑 它里面有很多语句,取决于参数、不同的检查、取决于组合的计算等等 这个函数被调用了数百万次,需要大量的执行时间。我想缩短这段时间 所有参数都取自config.ini文件,因此在编译时它们是未知的 但我知道,param1可能在diapason[1..3]中,param2可能在diapason[0..1]中,等等 最后,这些参数可能有200个

例如,函数
void Func(long param1、long param2、long param3、long param4、long param5)中有硬逻辑

它里面有很多语句,取决于参数、不同的检查、取决于组合的计算等等

这个函数被调用了数百万次,需要大量的执行时间。我想缩短这段时间

所有参数都取自
config.ini
文件,因此在编译时它们是未知的

但我知道,param1可能在diapason[1..3]中,param2可能在diapason[0..1]中,等等

最后,这些参数可能有200个组合

我希望我的编译器编译分离的200个组合,在运行时开始时,当加载
config.ini
时,只需选择其中一个,并避免运行时计算参数的依赖项


这可以在C++98中实现吗?或者在C++11/14中?

我不知道您是否考虑过这一点,但您可以在开始时加载配置,计算200个可能的解决方案,并将它们放入查找表中。这取决于您可以空闲的存储空间。因为您的组合数量似乎很小,所以这应该没有问题。您可以简单地将参数合并为整数。例如,(x=[0…3];y=[0…1])=>使用前2位表示x第3位表示y,依此类推。使用循环计算所有可能性。并将结果存储在数组中。如果你不拥有二次幂的参数。你可以简单地增加可能性。例如x=[0…3]y=[0…5]z=[0…2]=>idx=x+y*(x=4的可能性)+z*(位置x=4)*(位置y=6)

使用模板当然是可能的,因为模板 可以使用整数而不是类型参数。例如 跟随功能

template <int iParam1, int iParam2>
int sum()
{
    return iParam1 + iParam2;
}
然后,创建一个将参数组合映射到函数的
std::map
其中这些参数是固定的。大概是这样的:

using ParamCombination = std::tuple<long, long, long, long, long>;

using ParamsToFunction = std::pair < ParamCombination, std::function<void()> >;

std::map< ParamCombination, std::function<void()> > map =
{
    ParamsToFunction(std::make_tuple<long, long, long, long, long>(1, 2, 2, 2, 2), Func<1, 2, 2, 2, 2>),
    ...
    // This map will contain pairs of all possible parameter combinations
    // and their corresponding functions. This is a long list but it can be
    // easily generated using a script.    
};

但要创建这样的映射,要使200个函数体(内部有不同的参数)稍有不同实在是很困难的。我想使用模板之类的东西,但不是用于类型,而是用于参数。使用查找表是个好主意。特别是因为组合的数量很少。然而,只有当函数的输出完全依赖于输入参数时,才能使用这种方法。函数可能也使用了一些对象或系统状态。谢谢,这看起来像我想要实现的。将其推广到C++98并不困难。
using ParamCombination = std::tuple<long, long, long, long, long>;

using ParamsToFunction = std::pair < ParamCombination, std::function<void()> >;

std::map< ParamCombination, std::function<void()> > map =
{
    ParamsToFunction(std::make_tuple<long, long, long, long, long>(1, 2, 2, 2, 2), Func<1, 2, 2, 2, 2>),
    ...
    // This map will contain pairs of all possible parameter combinations
    // and their corresponding functions. This is a long list but it can be
    // easily generated using a script.    
};
auto comb = ParamCombination(1, 2, 2, 2, 2);
map[comb](); // function call