在C ++中自动生成代码

时间:2011-03-13 17:38:49

标签: c++ code-generation

我想要一段不涉及循环但自动生成一些C ++代码的代码。

我有const int d,从中我想编写d行代码来访问数组。所以例如

for(int k=0; k<d;++k){
  // do something to myarryay[k];
}

但我不想在for循环中写这个。我希望编译器执行,好像编写了以下代码行:

do something to myarray[0]
do something to myarray[1]
.
.
.
do something to myarray[d]

任何人都可以给我一些关于这样做的代码的建议吗?

提前致谢。

2 个答案:

答案 0 :(得分:6)

您确定需要手动执行此操作吗?这是一项称为loop unrolling的优化。在足够高的优化级别,您的编译器将为您完成,并且可能比您更好,因为优秀的优化编译器将考虑权衡(减少指令缓存局部性,一个)。

答案 1 :(得分:5)

你应该很少需要手动展开循环(我会说永远不会,但是如果你正在处理具有疯狂性能要求的东西并且你认为你可以单独使用编译器优化器,那么也许你可以手动展开一个循环循环)。

如果由于某种原因确实需要这样做,那么在预处理器的帮助下它非常简单:

#include <boost/preprocessor.hpp>

#include <iostream>

void f(int x) { std::cout << x << std::endl; }

int main()
{
    #define MYARRAY_COUNT 10
    int myarray[MYARRAY_COUNT] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    #define GENERATE_ELEMENT_CASE(z, n, data) f(myarray[n]);

    BOOST_PP_REPEAT(MYARRAY_COUNT, GENERATE_ELEMENT_CASE, x)

    #undef GENERATE_ELEMENT_CASE
    #undef MYARRAY_COUNT
}

展开的main()函数如下所示:

int main()
{
    int myarray[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    f(myarray[0]); f(myarray[1]); f(myarray[2]); f(myarray[3]); f(myarray[4]);
    f(myarray[5]); f(myarray[6]); f(myarray[7]); f(myarray[8]); f(myarray[9]);
}