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

C++ Compile code for all variants of finite number of settings

比如函数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 个可能的解决方案并将它们放入查找中 table。这取决于您可以腾出的存储空间。由于您的组合数量似乎很少,所以这应该没有问题。您只需将参数合并为一个整数。例如。 ( x =[0...3]; y = [0...1]) => 对 x 使用前 2 位,对 y 使用第 3 位,依此类推。使用循环计算所有可能性。并将结果存储在数组中。如果您不拥有具有两个幂的参数。您可以简单地增加可能性。例如 x =[0...3] y =[0...5] z =[0...2] => idx = x + y*(x = 4 的可能性) + z * (pos. x = 4) * (位置 y = 6)

使用模板当然可以做到这一点,因为模板 可以有整数而不是类型参数。例如, 以下函数

template <int iParam1, int iParam2>
int sum()
{
    return iParam1 + iParam2;
}

是一个函数,其中iParam1iParam2是固定值 特定的模板实例化。例如,函数 sum<1, 2> 是 一个总是 returns 3.

的函数

在你的例子中,用这个原型定义 Func

template <long Param1, long Param2, long Param3, long Param4, long Param5>
void Func()

然后,创建一个 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.    
};

这些函数将具有编译时优化的所有好处。 最后,在运行时,您需要做的就是创建一个表示 参数组合并调用此元组映射到的函数:

auto comb = ParamCombination(1, 2, 2, 2, 2);
map[comb](); // function call