Есть ли штраф за выполнение, если я использую лямбду вместо блока If?
Это зависит от вашего компилятора и ваших оптимизационных флагов.
С современным G CC, вызванным как gcc -Wall -O3 -mtune=native
, вы будете удивлены оптимизацией, которую он может выполнить, включая встроенные расширения . Вас может даже заинтересовать оптимизация времени ссылки и оптимизация всей программы (например, c. Compile и ссылка с gcc -O3 -flto -fwhole-program
....). Прочитайте о G CC флагах оптимизации .
См., Например, этот черновой отчет, финансируемый проектом CHARIOT H2020.
Конечно, зло в деталях .
И вы можете расширить G CC с помощью плагина , улучшающего еще больше оптимизаций.
Однако помните, что оптимизация компилятора теоретически неразрешима (см. λ-исчисление , Теорема Райса , Теорема MRDP , теоремы неполноты , соответствие Карри-Ховарда , AGI , Блог Дж. Питрата , RefPerSys project, et c ...) и практически несовершенный (больше искусство, чем наука).
Сложность (и коммерческая тайна) современных высокопроизводительных процессоров ( Кэш ЦП , предсказатели ветвлений , суперскалярные архитектуры ) делают время выполнения в худшем случае анализ практически невозможным. На практике вы столкнетесь со случаями, когда оптимизация компилятора вас разочарует. Поэтому приложите усилия к профилированию (например, с gprof или perf на Linux)
См. Также Ctuning, CompCert и Milepost G CC проектов. Также рассмотрим OpenCL , OpenMP , OpenA CC.
Не забудьте финансировать и поддерживать исследовательские группы, специализирующиеся на оптимизации, например: отправьте мне письмо на basile@starynkevitch.net
(но бюджетные требования составляют более 100 тыс. евро, а задержки превышают год).
Наконец, вы можете (на многих платформах) сгенерировать спецификацию c код во время выполнения (используя методы частичной оценки ). Затем рассмотрите использование библиотек JIT , таких как libgccjit . В некоторых операционных системах вы можете сгенерировать код C ++ во время выполнения, затем скомпилировать его и загрузить как плагин (например, с dlopen
).
Чтение курс Томпсона Размышления о доверительном доверии бумага и документы Бьярна Страуструпа .
Можно, конечно, рассмотреть вопрос об использовании JNI или SBCL или LuaJIT . Оба могут быть смешаны с C ++ на основных вычислительных платформах и практически упрощают генерацию кода во время выполнения, поэтому усилия могут улучшить время выполнения.
Вы кодируете:
inline void tab(const char* label, std::function<void()> fn)
(и ваш код не делает то, что вы хотите, если fn
, возможно, косвенно, throw
- за некоторым исключением) я бы предложил вместо
inline void tab(const char* label, const std::function<void()>& fn)