Самораспаковывающийся макрос-цикл в C / C ++

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

Поэтому я подумал, что вместо того, чтобы вручную развернуть цикл с помощью функции копирования и вставки, я мог бы использовать макросы, чтобы развернуть цикл во время компиляции, чтобы его можно было легко изменить позже.

То, что я представляю, выглядит примерно так:

#define LOOP_N_TIMES(N, CODE) <insert magic here>

Так что я могу заменитьfor (int i = 0; i < N, ++i) { do_stuff(); } с:

#define INNER_LOOP_COUNT 4
LOOP_N_TIMES(INNER_LOOP_COUNT, do_stuff();)

И он разворачивается, чтобы:

do_stuff(); do_stuff(); do_stuff(); do_stuff();

Поскольку препроцессор C все еще остается для меня загадкой, я понятия не имею, как это сделать, но я знаю, что это должно быть возможно, потому что Boost, кажется, имеетBOOST_PP_REPEAT макросы. К сожалению, я не могу использовать Boost для этого проекта.

Ответы на вопрос(2)

Ваш ответ на вопрос