嵌套循环展开

Nested loop unrolling

本文关键字:循环展开 嵌套      更新时间:2023-10-16

给定我有一个函数

double doSomething(int const a, int const b, int const c) { /*...*/}

我想测试不同输入a、b和c的这个函数。然后,我可以给出一个可能参数的列表,并用三个循环测试所有组合:

int aTest[] = {1,2,3,4}
int bTest[] = {-5,-3,0}
int cTest[] = {2,65,8,0,-100}
for (unsigned int i = 0; i < 4; ++i) {
    for (unsigned int j = 0; j < 3; ++j) {
        for (unsinged int k = 0; k < 5; ++k) {
            double val = doSomething(aTest[i], bTest[j], cTest[k]);
            //Compare results etc.
        }
    }
}

希望编译器足够聪明,可以在编译时展开这些循环,这样就可以生成这样的东西:

doSomething(1,-5,2);
doSomething(1,-5,65);
doSomething(1,-5,8);
//...

然而,考虑到我的编译器不够聪明,无法展开,我该如何处理模板?

您可以尝试这样做:

double TestData[] = { 1.5, 2.7, 3.6, 4.5, 7.9 };
template<int K>
class Super {
public:
    inline static void Do()
    {
        Super<K - 1>::Do();
        double val = doSomething( TestData[K] );
    }
};
template<>
class Super<0> {
public:
    inline static void Do()
    {
        double val = doSomething( TestData[0] );
    }
};