Автоматическая генерация кода в C++

Я хочу кусок кода, который не включает в себя циклы, но автоматически генерирует некоторый код 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 ответа

Решение

Вы уверены, что вам нужно сделать это вручную? Это оптимизация, известная как развертывание цикла. При достаточно высоких уровнях оптимизации ваш компилятор сделает это за вас, и, возможно, лучше, чем вы, поскольку хороший оптимизирующий компилятор будет принимать во внимание компромиссы (например, уменьшенная локальность кэша команд).

Вам редко нужно вручную развернуть цикл (я бы сказал, никогда, но если вы работаете над чем-то с безумными требованиями к производительности и думаете, что можете включить оптимизатор компилятора, то, возможно, вы можете вручную развернуть цикл).

Если вам нужно сделать это по какой-то причине, это довольно просто с помощью препроцессора:

#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]);
}
Другие вопросы по тегам