В настоящее время я работаю над проектом, где важен каждый цикл. При профилировании своего приложения я обнаружил, что накладные расходы некоторых внутренних циклов довольно высоки, потому что они состоят всего из нескольких машинных инструкций. Кроме того, количество итераций в этих циклах известно во время компиляции.
Поэтому я подумал, что вместо ручного развертывания цикла с помощью копирования и вставки я мог бы использовать макросы для развертывания цикла во время компиляции, чтобы его можно было легко изменить позже.
То, что я представляю, выглядит примерно так:
#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 для этого проекта.
BOOST_PP_REPEAT
, и похоже, что он примерно такой же, как и большинство предлагаемых решений. Я надеялся, что будет более общее решение, но я полагаю, что это невозможно, потому что вы не можете писать рекурсивные макросы... - person Karsten   schedule 30.01.2015