cpprussia C++ Russia 2019 СПб (31.10.2019)

Исключения C++ через призму компиляторных оптимизаций

img

Доклад Романа продемонстрирует, когда делать сборку своего приложения с -fno-exceptions имеет смысл, а когда можно использовать C++ исключений, зная, что код не потерял в производительности.

На дворе 21-й век, непроизводительная реализация обработки C++ исключений на основе setjmp/longjmp уже в прошлом. Современные компиляторы, такие как gcc и clang, используют продвинутую реализацию C++ исключений, называемую zero-cost exception handling. Но насколько действительно это zero-cost? Да, мы платим увеличением размера бинарного файла, а также в случае, когда исключение действительно выбрасывается, запуская процесс stack unwinding, вызывая деструкторы для локальных объектов и т.д. Но теряем ли мы производительность, если исключение не выбрасывается? Появляются ли какие-то ограничения на компиляторные оптимизации?

В этом докладе дано описание того, каким образом C++ исключения оказывают влияние на компиляторные оптимизации. Какие оптимизации не могут быть применены в случае, если функция может бросить исключения, а какие оптимизации становится труднее применять.

Примеры реализации исключений и компиляторных оптимизаций рассматриваются на базе LLVM.

Доклад преследует цель дать людям понимание, когда делать сборку своего приложения с -fno-exceptions имеет смысл, а когда можно наслаждаться всеми прелестями использования C++ исключений, зная, что их код не значительно потерял в производительности по сравнению с кодом, где исключения отключены.

Комментарий программного комитета:

Реализация исключений посягает на один из основных принципов языка — zero overhead abstractions. В своём докладе Роман продемонстрирует, как это напрямую сказывается на оптимизациях в LLVM.