Самораспаковывающийся макрос-цикл в 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 для этого проекта.