Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

влекательный C : Счетчик времени компиляции

Anna | 25.06.2014 | нет комментариев

Предлагается разработать безвредную альтернативу встроенного макроса __COUNTER__. Первое вступление макроса заменяется на 0, второе на 1, и так дальше. Значение __COUNTER__ подставляется на этапе препроцессирования, следственно его дозволено применять в контексте constant expression.

К сожалению, макрос __COUNTER__ небезопасно применять в заголовочных файлах — при ином порядке включения заголовочных файлов подставленные значения счетчика поменяются. Это может привести к обстановки, когда скажем в foo.cpp значение константы AWESOME равно 42, в то время как в bar.cppAWESOMErmark!template<size_t n> cn<n> magic(cn<n>); // (3) нынешнее значение счетчика sizeof(magic(cn<0>())) - 1; // 0 // (4) «инкремент» cn<1> magic(cn<0>); // (5) нынешнее значение счетчика sizeof(magic(cn<0>())) - 1; // 1 

  1. Определяем шаблонную конструкцию cn<n>. Подметим, что sizeof(cn<n>) елезнодорожной сети сверху вниз, «сворачивая» на стрелках вправо либо налево. Выражение из N вложенных вызовов функций порождает сеть с 2N выходами. Переключая стрелки в положительном порядке, дозволено ступенчато получить все 2N допустимых типов Ti на выходе сети.Дозволено показать, что если нынешний тип на выходе сети Ti, то дальнейшей необходимо переключить стрелку M[(i 1)&~i, (i 1)&i].

    Окончательный вариант кода доступен по ссылке.

    Взамен завершения

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

    Насколько такие решения практичны?

    ИМХО если исключительный C файл компилируется больше 5 минут, причем совладать с ним может только самая последняя версия компилятора — это верно непрактично. Многие «креативные» варианты применения языковых вероятностей в C представляют экстраординарно академический интерес. Как правило, те же задачи дозволено отменнее решить иными методами, скажем путем привлечения внешнего кодогенератора. Правда, нужно сказать, автор несколько предвзят в данном вопросе, категорично не признавая spirit, и испытывая некоторую слабость по отношению к bison.

    Кажется, счетчик времени компиляции так же не особенно практичен, как отлично видно на дальнейшем графике. По оси x отложена безусловная величина приращения счетчика в тестовой программе (тестовая программа состоит из строк counter_inc(int)), по оси y — время компиляции в секундах. Для сопоставления, там же отложено время компиляции nginx-1.5.2.

 

Источник: programmingmaster.ru

 

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB