Template Metaprogramming in C++ / Підшивка ім. FTL / OOP - Портал об’єктно-орієнтованого програмування Подорожуй з gofrie.com

Template Metaprogramming in C++

Практична користь шаблонів в плюсах — не тільки генерація коду (яскравий приклад — стратегії Alexandrescu), але й обчислення на етапі компіляції і оптимізація коду (далі поясню, що маю на увазі).

1. Обчислення на етапі компіляції. Представляють скоріше теоретичний інтерес, хоча і дають простір для оптимізації (в деяких практичних застосуваннях, наприклад, FFT, забезпечують дуже пристойний виграш в швидкості).
На жаль, чомусь всі люблять демонструвати паршиві приклади з неефективними алгоритмами (наприклад, числа Фібоначчі і піднесення до степеня ніколи не роблять правильно). Виправив цю досадну несправедливість.
Починаючи з C++11, такі трюки втрачають актуальність через constexpr, який дозволяє робити те саме, тільки зрозуміліше і естетичніше.

2. Оптимізація коду. Як правило, йдеться про якийсь ітеративний алгоритм, реалізовиний рекурсивними шаблонними визначеннями. Розумний компілятор, який знає трюки типу inlining і loop unrolling, може перетворити таку шаблонну рекурсивну функцію в звичайну послідовність операторів без логіки циклу чи рекурсії, тим самим значно вкоротивши кількість інструкцій.
Для прикладу, так можна перетворити BubbleSort масиву, розмір якого — стала етапу компіляції, в послідовність свопів, більше того, в цій ситуації prefetcher дасть максимальний приріст швидкості. Інший приклад — обчислення функції за розкладом в ряд Тейлора, кількість членів розкладу якого — теж константа етапу компіляції: на виході — код без зайвих змінних/лічильників/викликів функцій.

Проект для студії (версія 2013+) лежить тут. Деякі фічі типу static_assert не працюватимуть в старих студіях, їх можна закоментувати. З іншими компіляторами проблем бути не повинно (хіба якісь нюанси часткової спеціалізації).

А тут непогана презентація про шаблони в плюсах, в тому числі і про їх повноту за Тюрингом.

Enjoy!
  • 0
  • 20 червня 2014, 18:32
  • FTL
Автор має нагороди

Коментарі (0)

RSS згорнути / розгорнути