Разбор нестандартной реализации преобразования целого числа в строку без использования циклов и рекурсивных вызовов времени исполнения - только рекурсия на этапе компиляции
Фитнес для вашего кода: как держать его в формеIlia Shishkov
C++ Россия 2017
Во время моего выступления мы поговорим о принципе "Minimize coupling, maximize cohesion". Обсудим, что это такое и что значат эти непонятные слова. Кроме того на приближенном к реальности примере мы рассмотрим, как, применяя указанный принцип, можно держать ваш код в форме, чтобы он был готов ко всем неожиданностям, которые подстерегают ваш проект в течение его жизни.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Roman Orlov
В докладе будут затронуты принципиальные вопросы — зачем нам программировать на шаблонах, как мы это делаем в C++11/14 и как будем это делать в C++17. Проведем параллель с функциональными языками (привет Haskell!). На примере реального кода разберем fold-expressions и увидим, чем опасен constexpr-if. А также взглянем на метапрограммирование в стиле C++11/14 и C++17 глазами компилятора.
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
Одной из проблем C++ является большое количество конструкций, поведение которых не определено или просто неожиданно для программиста. С такими ошибками мы часто сталкиваемся при разработке статического анализатора кода. Но, как известно, лучше всего находить ошибки ещё на этапе компиляции. На этом докладе мы поговорим о том, какие техники из современного C++ позволяют писать не только более простой и выразительный, но и безопасный код. Вы увидите ошибки в коде различных Open Source проектов и узнаете, как можно их избежать, используя новые стандарты
Доклад вводит в рассмотрение универсальный адаптер, позволяющий обернуть любой класс с целью добавления новых свойств, отсутствующих в оригинальном классе. Получаемые классы могут иметь в точности такой же интерфейс, как и первоначальные, что позволяет прозрачно заменять их и оборачивать любое количество раз.
Это позволяет добавлять необходимые свойства объектам, не переписывая его с нуля. Предложенная обобщенная концепция будет последовательно введена и проиллюстрирована простыми, но интересными примерами.
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
В докладе перед нами откроется великолепный мир велосипедов и устаревших технологий, которые люди продолжают переносить в новые проекты и повсеместно использовать. Мы поговорим о:
Copy-On-Write
разработке без оглядки на готовые решения и к чему это приводит
force inline
оптимизациях, которые отлично себя показывают на бенчмарках и плохо себя ведут в реальной жизни
бездумно отключаемых оптимизациях компилятора
тонкостях стандартной библиотеки для повседневного использования
супер качественном велосипедостроении
Григорий Демченко, Асинхронность и неблокирующая синхронизацияSergey Platonov
Практика показывает, что использование подхода, основанного на колбеках для асинхронного программирования обычно не является удобным и подвержено различным ошибкам. Для упрощения написания и поддержки сложных асинхронных программ можно использовать несколько иной подход: использовать сопрограммы для переключения контекста на время ожидания события. Такой подход позволяет реализовать интересные неблокирующие примитивы, включая неблокирующее сетевое взаимодействие, неблокирующие мьютексы, а также удобное переключение между различными пулами потоков для разнесения выполнения задач, которые требуют различные ресурсы.
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
В последнее время в промышленной разработке ПО особую популярность обретают Domain-Specific Lanugages (DSL). Они драматически упрощают разработку и дают возможность “программировать” не только программистам, но и пользователям прикладных программ.
В своем докладе я расскажу об опыте использования DSL применительно к С++, причем упор будет сделан на производительность кода DSL, и его мгновенную “встраиваемость” в запущенную программу путем компиляции DSL-кода в нативный код с помощью инструментария LLVM.
В рамках данного выступления вас ждут:
* рассказ о полезных и интересных вещах из Boost
* новости с передовиц разработки Boost и о новинках ожидаемых в следующих версиях
* что из Boost готовится к переезду в новый стандарт С++
* как экспериментировать с Boost, имея под рукой только браузер
* что людям не нравится в Boost и как с этими людьми бороться (-:
Фитнес для вашего кода: как держать его в формеIlia Shishkov
C++ Россия 2017
Во время моего выступления мы поговорим о принципе "Minimize coupling, maximize cohesion". Обсудим, что это такое и что значат эти непонятные слова. Кроме того на приближенном к реальности примере мы рассмотрим, как, применяя указанный принцип, можно держать ваш код в форме, чтобы он был готов ко всем неожиданностям, которые подстерегают ваш проект в течение его жизни.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Roman Orlov
В докладе будут затронуты принципиальные вопросы — зачем нам программировать на шаблонах, как мы это делаем в C++11/14 и как будем это делать в C++17. Проведем параллель с функциональными языками (привет Haskell!). На примере реального кода разберем fold-expressions и увидим, чем опасен constexpr-if. А также взглянем на метапрограммирование в стиле C++11/14 и C++17 глазами компилятора.
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
Одной из проблем C++ является большое количество конструкций, поведение которых не определено или просто неожиданно для программиста. С такими ошибками мы часто сталкиваемся при разработке статического анализатора кода. Но, как известно, лучше всего находить ошибки ещё на этапе компиляции. На этом докладе мы поговорим о том, какие техники из современного C++ позволяют писать не только более простой и выразительный, но и безопасный код. Вы увидите ошибки в коде различных Open Source проектов и узнаете, как можно их избежать, используя новые стандарты
Доклад вводит в рассмотрение универсальный адаптер, позволяющий обернуть любой класс с целью добавления новых свойств, отсутствующих в оригинальном классе. Получаемые классы могут иметь в точности такой же интерфейс, как и первоначальные, что позволяет прозрачно заменять их и оборачивать любое количество раз.
Это позволяет добавлять необходимые свойства объектам, не переписывая его с нуля. Предложенная обобщенная концепция будет последовательно введена и проиллюстрирована простыми, но интересными примерами.
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
В докладе перед нами откроется великолепный мир велосипедов и устаревших технологий, которые люди продолжают переносить в новые проекты и повсеместно использовать. Мы поговорим о:
Copy-On-Write
разработке без оглядки на готовые решения и к чему это приводит
force inline
оптимизациях, которые отлично себя показывают на бенчмарках и плохо себя ведут в реальной жизни
бездумно отключаемых оптимизациях компилятора
тонкостях стандартной библиотеки для повседневного использования
супер качественном велосипедостроении
Григорий Демченко, Асинхронность и неблокирующая синхронизацияSergey Platonov
Практика показывает, что использование подхода, основанного на колбеках для асинхронного программирования обычно не является удобным и подвержено различным ошибкам. Для упрощения написания и поддержки сложных асинхронных программ можно использовать несколько иной подход: использовать сопрограммы для переключения контекста на время ожидания события. Такой подход позволяет реализовать интересные неблокирующие примитивы, включая неблокирующее сетевое взаимодействие, неблокирующие мьютексы, а также удобное переключение между различными пулами потоков для разнесения выполнения задач, которые требуют различные ресурсы.
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
В последнее время в промышленной разработке ПО особую популярность обретают Domain-Specific Lanugages (DSL). Они драматически упрощают разработку и дают возможность “программировать” не только программистам, но и пользователям прикладных программ.
В своем докладе я расскажу об опыте использования DSL применительно к С++, причем упор будет сделан на производительность кода DSL, и его мгновенную “встраиваемость” в запущенную программу путем компиляции DSL-кода в нативный код с помощью инструментария LLVM.
В рамках данного выступления вас ждут:
* рассказ о полезных и интересных вещах из Boost
* новости с передовиц разработки Boost и о новинках ожидаемых в следующих версиях
* что из Boost готовится к переезду в новый стандарт С++
* как экспериментировать с Boost, имея под рукой только браузер
* что людям не нравится в Boost и как с этими людьми бороться (-:
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
Зачастую, знакомство с алиасингом в C++ у многих программистов начинается и заканчивается одинаково: -fno-strict-aliasing. На вопросы новичка, более опытные коллеги отвечают в стиле: «не трогай! а то все сломаешь!». Новичок и не трогает. В докладе будет предпринята попытка заглянуть под капот и понять, что же там, внутри. Что такое алиасинг, где он может быть полезен и какие реальные преимущества дает. Тема будет рассмотрена и со стороны программиста и со стороны разработчика компилятора. А по сему, вопрос «зачем?» будет центральным в повествовании.
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
В докладе рассмотрены подходы к созданию надежных юнит-тестов, которые просты в поддержке и модернизации, а также принципы создания кода пригодного для покрытия автотестами. Приведены два способа внедрения зависимости: с использованием конструктора тестируемого объекта, а также с использованием подхода "выделить и переопределить". Каждый из способов разобран на примере, демонстрирующем особенности его реализации и применения. Приведен ряд практических советов, нацеленных на создание надежных юнит-тестов. Использование на практике приведенных подходов и принципов позволяет упростить процесс поддержки и модификации существующего кода, а также дает уверенность в надежности работы добавляемого нового функционала. В конечном итоге это приводит к повышению качества разрабатываемого продукта.
Андрей Карпов
Вы узнаете, что такое статический анализ кода и историю его развития. Узнаете, как эффективно применять инструменты статического анализа в своей работе, увидите практические примеры использования этой методологии. Доклад ориентирован на программистов, использующих языки Си/Си++, но будет полезен всем
ЛЕКЦИЯ 5. Шаблоны многопоточного программирования
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
ЛЕКЦИЯ 8. Многопоточное программирование без использования блокировок. Модель потребитель-производитель. Потокобезопасный стек. Проблема ABA. Указатели опасности.
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
Обобщенное программирование - это подход к программированию, когда алгоритм пишется без указания конкретных типов данных. Используя данный подход можно значительно увеличить количество повторно используемого кода. В C++ данный подход реализуется за счет механизма шаблонов. В данном докладе рассмотрим некоторые возможности по обобщенному программированию, которые предоставляет C++. На конкретных примерах рассмотрим, как они могут упростить нам жизнь и с какими трудностями приходится сталкиваться при их использовании.
В докладе будут сделаны попытки ответить на вопросы, какой тип скрывается под маской auto, почему T&& не всегда rvalue, и почему move ничего не двигает.
Мало кто отчетливо представляет, как работают исключения в С++.
Автор пытается восполнить этот пробел, заодно пытаясь выяснить, почему всё устроено так как оно устроено и нельзя ли там чего-нибудь улучшить.
1) Две основные проблемы - как обустроить раскрутку стека
и как осуществить передачу управления при возникновении исключения
2) Раскрутка стека - GCC LDSA, MSVC32, MSVC64
3) Передача управления - SJLJ, DW2, MSVC
4) Раскручиваем стек своими руками
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Platonov Sergey
За время работы над проектом был разработан удобный фреймворк для написания асинхронного кода. В докладе будет рассмотрено то, как он устроен и как со временем эволюционировал. Разберемся, как с помощью наших примитивов решать проблемы, часто встречающиеся в асинхронном программирование; будут примеры удачного и неудачного использования. Отдельно остановимся на сравнении получившихся средств с тем, что было добавлено в С++11.
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...Alexey Paznikov
ЛЕКЦИЯ 6. Атомарные операции. Внеочередное выполнение инструкций. Барьеры памяти. Семантика захвата-освобождения. Модель памяти C++
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
преподаватель:
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...Alexey Paznikov
ЛЕКЦИЯ 5. Многопоточное программирование в языке С++. Работа с потоками. Защита данных. Синхронизация. Будущие результаты
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
преподаватель:
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
ЛЕКЦИЯ 7. Многопоточное программирование без блокировок. Модель потребитель-производитель. Потокобезопасный стек: проблема ABA, указатели опасности, сборщики мусора, счётчик ссылок, применение модели памяти С++.
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
Рассмотрены известные автору подходы к реализации как lock-free, так и fine-grained lock-based set/map: хеш-таблицы, деревья. Что из подходов STL может быть реализовано в lock-free манере, а что принципиально нет. Подводные камни lock-free и их нейтрализация.
ЛЕКЦИЯ 4. Шаблоны многопоточного программирования
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
ЛЕКЦИЯ 3. Реентерабельность. Сигналы. Локальные данные потоков. Принудительное завершение потоков
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...Alexey Paznikov
ЛЕКЦИЯ 6. Разработка параллельных структур данных на основе блокировок
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
Евгений Зуев, С++ в России: Стандарт языка и его реализацияPlatonov Sergey
Доклад посвящён различным аспектам компилятора С++, созданного с участием автора. В выступлении рассказывается о продвинутой архитектуре компилятора, основных проектных решениях, а также обсуждаются особенности входного языка, повлиявшие на реализацию компилятора.
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU
http://techtalks.nsu.ru
Видеозапись: http://www.youtube.com/watch?v=v7uBLSm6ft8
06 октября 2015. Как приручить дракона: введение в LLVM (Дмитрий Кашицын, HDsoft)
«В этом докладе мы кратко расскажем о таком звере, о котором много кто слышал, но немногие щупали. Что такое компилятор на самом деле? Чем LLVM отличается от других компиляторов? Как в LLVM происходит компиляция программы, как работают оптимизации? Наконец, какой путь проходит программа от разбора исходного текста до генерации исполняемого файла?
Лекция будет обзорной и не потребует от слушателей глубоких знаний теории компиляторов.»
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
Зачастую, знакомство с алиасингом в C++ у многих программистов начинается и заканчивается одинаково: -fno-strict-aliasing. На вопросы новичка, более опытные коллеги отвечают в стиле: «не трогай! а то все сломаешь!». Новичок и не трогает. В докладе будет предпринята попытка заглянуть под капот и понять, что же там, внутри. Что такое алиасинг, где он может быть полезен и какие реальные преимущества дает. Тема будет рассмотрена и со стороны программиста и со стороны разработчика компилятора. А по сему, вопрос «зачем?» будет центральным в повествовании.
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
В докладе рассмотрены подходы к созданию надежных юнит-тестов, которые просты в поддержке и модернизации, а также принципы создания кода пригодного для покрытия автотестами. Приведены два способа внедрения зависимости: с использованием конструктора тестируемого объекта, а также с использованием подхода "выделить и переопределить". Каждый из способов разобран на примере, демонстрирующем особенности его реализации и применения. Приведен ряд практических советов, нацеленных на создание надежных юнит-тестов. Использование на практике приведенных подходов и принципов позволяет упростить процесс поддержки и модификации существующего кода, а также дает уверенность в надежности работы добавляемого нового функционала. В конечном итоге это приводит к повышению качества разрабатываемого продукта.
Андрей Карпов
Вы узнаете, что такое статический анализ кода и историю его развития. Узнаете, как эффективно применять инструменты статического анализа в своей работе, увидите практические примеры использования этой методологии. Доклад ориентирован на программистов, использующих языки Си/Си++, но будет полезен всем
ЛЕКЦИЯ 5. Шаблоны многопоточного программирования
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
ЛЕКЦИЯ 8. Многопоточное программирование без использования блокировок. Модель потребитель-производитель. Потокобезопасный стек. Проблема ABA. Указатели опасности.
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
Обобщенное программирование - это подход к программированию, когда алгоритм пишется без указания конкретных типов данных. Используя данный подход можно значительно увеличить количество повторно используемого кода. В C++ данный подход реализуется за счет механизма шаблонов. В данном докладе рассмотрим некоторые возможности по обобщенному программированию, которые предоставляет C++. На конкретных примерах рассмотрим, как они могут упростить нам жизнь и с какими трудностями приходится сталкиваться при их использовании.
В докладе будут сделаны попытки ответить на вопросы, какой тип скрывается под маской auto, почему T&& не всегда rvalue, и почему move ничего не двигает.
Мало кто отчетливо представляет, как работают исключения в С++.
Автор пытается восполнить этот пробел, заодно пытаясь выяснить, почему всё устроено так как оно устроено и нельзя ли там чего-нибудь улучшить.
1) Две основные проблемы - как обустроить раскрутку стека
и как осуществить передачу управления при возникновении исключения
2) Раскрутка стека - GCC LDSA, MSVC32, MSVC64
3) Передача управления - SJLJ, DW2, MSVC
4) Раскручиваем стек своими руками
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Platonov Sergey
За время работы над проектом был разработан удобный фреймворк для написания асинхронного кода. В докладе будет рассмотрено то, как он устроен и как со временем эволюционировал. Разберемся, как с помощью наших примитивов решать проблемы, часто встречающиеся в асинхронном программирование; будут примеры удачного и неудачного использования. Отдельно остановимся на сравнении получившихся средств с тем, что было добавлено в С++11.
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...Alexey Paznikov
ЛЕКЦИЯ 6. Атомарные операции. Внеочередное выполнение инструкций. Барьеры памяти. Семантика захвата-освобождения. Модель памяти C++
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
преподаватель:
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...Alexey Paznikov
ЛЕКЦИЯ 5. Многопоточное программирование в языке С++. Работа с потоками. Защита данных. Синхронизация. Будущие результаты
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
преподаватель:
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
ЛЕКЦИЯ 7. Многопоточное программирование без блокировок. Модель потребитель-производитель. Потокобезопасный стек: проблема ABA, указатели опасности, сборщики мусора, счётчик ссылок, применение модели памяти С++.
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
Рассмотрены известные автору подходы к реализации как lock-free, так и fine-grained lock-based set/map: хеш-таблицы, деревья. Что из подходов STL может быть реализовано в lock-free манере, а что принципиально нет. Подводные камни lock-free и их нейтрализация.
ЛЕКЦИЯ 4. Шаблоны многопоточного программирования
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
ЛЕКЦИЯ 3. Реентерабельность. Сигналы. Локальные данные потоков. Принудительное завершение потоков
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...Alexey Paznikov
ЛЕКЦИЯ 6. Разработка параллельных структур данных на основе блокировок
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
Евгений Зуев, С++ в России: Стандарт языка и его реализацияPlatonov Sergey
Доклад посвящён различным аспектам компилятора С++, созданного с участием автора. В выступлении рассказывается о продвинутой архитектуре компилятора, основных проектных решениях, а также обсуждаются особенности входного языка, повлиявшие на реализацию компилятора.
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU
http://techtalks.nsu.ru
Видеозапись: http://www.youtube.com/watch?v=v7uBLSm6ft8
06 октября 2015. Как приручить дракона: введение в LLVM (Дмитрий Кашицын, HDsoft)
«В этом докладе мы кратко расскажем о таком звере, о котором много кто слышал, но немногие щупали. Что такое компилятор на самом деле? Чем LLVM отличается от других компиляторов? Как в LLVM происходит компиляция программы, как работают оптимизации? Наконец, какой путь проходит программа от разбора исходного текста до генерации исполняемого файла?
Лекция будет обзорной и не потребует от слушателей глубоких знаний теории компиляторов.»
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
10 июня 2015. Дмитрий Кашицын (HDsoft) дает обзор LLVM.
http://techtalks.nsu.ru
Видеозапись: https://plus.google.com/events/ctes98f7uhf19t5jlvlbk24dan4
В этом докладе мы кратко расскажем о таком звере, как LLVM, о котором много кто слышал, но немногие щупали. Что такое компилятор на самом деле? Чем LLVM отличается от других компиляторов? Как в LLVM происходит компиляция программы, как работают оптимизации? Наконец, какой путь проходит программа от разбора исходного текста до генерации исполняемого файла?
Лекция будет обзорной и не потребует от слушателей глубоких знаний теории компиляторов.
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
Дмитрий Прокопцев, Яндекс
Речь пойдёт о, наверное, одном из самых важных и в то же время сложных нововведений в С++11 — R-ссылках (rvalue references). Мы рассмотрим базовые правила работы с такими ссылками и связанные с ними новые концепции языка: перемещение классов, универсальные ссылки и перенаправление вызовов.
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
Евгений Крутько, НИЦ «Курчатовский институт».
В докладе на примере программы моделирования динамики движения конструкций по методу конечных элементов рассматриваются возможности и практика распараллеливания вычислений. Речь в нём пойдёт как о технике создания новых вычислительных потоков, так и об использовании стандартов openMP и MPI.
Название для привлечение внимания. На самом деле, презентация о том, что а) писать парсеры это просто, б) писать всякие вычислялки это просто, в) делается это вот так, г) бояться этого не нужно, а нужно делать.
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Yandex
Основываясь на опыте разработки Крипты, Дмитрий рассмотрит средства реализации статического и динамического полиморфизма в C++, а также некоторые их паттерны и антипаттерны.
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухинcorehard_by
В C++11 добавили новое ключевое слово - constexpr. Выглядит оно весьма невзрачно, да и на первый взгляд кажется, что смысла в нём маловато... Для чего же оно нужно, какие у него есть тайные супер способности и какую роль оно сыграет в дальнейшем развитии языка C++ - обо всём об этом мы и поговорим.
Поговорим о рефлексии в C++, о том, что это такое, для чего нужно и почему это вообще важно. На практическом примере с котами рассмотрим эволюцию подходов к рефлексии в рамках разных версий языка: C++03, C++11/14, C++17. Посмотрим на то, что для нас готовят разработчики нового стандарта, узнаем где и как можно "пощупать" эти новые возможности. Поделимся полезными утилитами и подходами, которые облегчат жизнь пока эти новые возможности не придут к вам на проект.
В третьей главе рассматриваются базовые свойства акторов, описанные в PhD диссертации Gul Agha: каждый актор имеет адрес, большой почтовый ящик, куда доставляются сообщения, адресованные актору и поведение. В ответ на входящее сообщение актор может отправить конечный набор сообщений другим акторам и/или создать конечное число новых акторов и/или поменять свое поведение для обработки следующего сообщения.
В рамках данного курса будет разработана библиотека для разработки параллельных приложений на платформе .NET, построенная по модели акторов.
Исходные коды библиотеки будут выкладываться на GitHub: https://github.com/hwdtech/HWdTech.DS
Код библиотеки будет разработан с использованием следующих принципов, приемов и методик:
S.O.L.I.D. - принципы
Unit-tests
Mock
IoC контейнеры
Для удобства слушателей курса краткий обзор данных практик приведен в Главе 4.
разработка серверов и серверных приложений лекция №3etyumentcev
В третьей главе рассматриваются базовые свойства акторов, описанные в PhD диссертации Gul Agha: каждый актор имеет адрес, большой почтовый ящик, куда доставляются сообщения, адресованные актору и поведение. В ответ на входящее сообщение актор может отправить конечный набор сообщений другим акторам и/или создать конечное число новых акторов и/или поменять свое поведение для обработки следующего сообщения.
В рамках данного курса будет разработана библиотека для разработки параллельных приложений на платформе .NET, построенная по модели акторов.
Исходные коды библиотеки будут выкладываться на GitHub: https://github.com/hwdtech/HWdTech.DS
Код библиотеки будет разработан с использованием следующих принципов, приемов и методик:
S.O.L.I.D. - принципы
Unit-tests
Mock
IoC контейнеры
Для удобства слушателей курса краткий обзор данных практик приведен в Главе 4.
Нас окружает мир сетей, мобильных устройств, сайтов, облаков. Чтобы работать с этим миром, придумано невероятное количество технологий и языков программирования. Есть ли среди них место для языков Си/Си++? Стоит ли тратить время на их изучение, стоит ли использовать их в своих проектах? Не пора ли этим языкам на пенсию? Эти темы в своем докладе обсудит Андрей Карпов, активно участвующий в жизни сообщества Си++-программистов. Забегая вперед можно утверждать - языки Си/Си++ живее всех живых. Андрей расскажет о развитии языка и новых возможностях, появившихся в Си++11. Многие возможности существенно облегчают работу программиста и сокращают объем кода.
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Догнать и перегнать boost::lexical_cast
1. 1/25
Догнать и перегнать boost::lexical_cast
Быстрое преобразование целого числа в строку
Орлов Роман
18 февраля 2017 г.
Орлов Роман Догнать и перегнать boost::lexical_cast
2. 2/25
Готовые решения
Стандартная библиотека
• семейство printf (sprintf, snprintf)
• потоки ввода/вывода (std::basic_stringstream)
• std::to_string
• std::to_chars [C++17]
Boost
• Lexical Cast
• Format
• Iostreams
• Spirit Karma
А также fmtlib, FastFormat, Qt и другие…
Орлов Роман Догнать и перегнать boost::lexical_cast
3. 3/25
Готовые решения
Без динамического выделения памяти
Стандартная библиотека
• семейство printf (sprintf, snprintf)
• потоки ввода/вывода (std::basic_stringstream)
• std::to_string
• std::to_chars [C++17]
Boost
• Lexical Cast
• Format
• Iostreams
• Spirit Karma
Орлов Роман Догнать и перегнать boost::lexical_cast
4. 3/25
Готовые решения
Без динамического выделения памяти
Стандартная библиотека
• семейство printf (sprintf, snprintf)
• потоки ввода/вывода (std::basic_stringstream)
• std::to_string
• std::to_chars [C++17]
Boost
• Lexical Cast
• Format
• Iostreams
• Spirit Karma
Орлов Роман Догнать и перегнать boost::lexical_cast
5. 3/25
Готовые решения
Без динамического выделения памяти
Стандартная библиотека
• семейство printf (sprintf, snprintf)
• потоки ввода/вывода (std::basic_stringstream)
• std::to_string
• std::to_chars [C++17]
Boost
• Lexical Cast
• Format
• Iostreams
• Spirit Karma
Орлов Роман Догнать и перегнать boost::lexical_cast
6. 3/25
Готовые решения
Без динамического выделения памяти
Стандартная библиотека
• семейство printf (sprintf, snprintf)
• потоки ввода/вывода (std::basic_stringstream)
• std::to_string
• std::to_chars [C++17]
Boost
• Lexical Cast
• Format
• Iostreams
• Spirit Karma
Орлов Роман Догнать и перегнать boost::lexical_cast
7. 3/25
Готовые решения
Без динамического выделения памяти
Стандартная библиотека
• семейство printf (sprintf, snprintf)
• потоки ввода/вывода (std::basic_stringstream)
• std::to_string
• std::to_chars [C++17]
Boost
• Lexical Cast
• Format
• Iostreams ???
• Spirit Karma
Орлов Роман Догнать и перегнать boost::lexical_cast
8. 4/25
Производительность boost::lexical_cast
Для всех xi = 100, i = 1, . . . , 10000
Clang 3.6.0 GCC 6.1.1
0
50
100
150
17
9
140
89
38
17
28
14
t,мс
lexical_cast std::stringstream+ctor std::stringstream printf
Орлов Роман Догнать и перегнать boost::lexical_cast
9. 5/25
Под капотом boost::lexical_cast
Итерационное решение
inline CharT* main_convert_loop() BOOST_NOEXCEPT {
while (main_convert_iteration());
return m_finish;
}
inline bool main_convert_iteration() BOOST_NOEXCEPT {
--m_finish;
int_type const digit = static_cast<int_type>(m_value % 10U);
Traits::assign(*m_finish, Traits::to_char_type(m_zero + digit));
m_value /= 10;
return !!m_value; // suppressing warnings
}
Орлов Роман Догнать и перегнать boost::lexical_cast
10. 5/25
Под капотом boost::lexical_cast
Итерационное решение
inline CharT* main_convert_loop() BOOST_NOEXCEPT {
while (main_convert_iteration());
return m_finish;
}
inline bool main_convert_iteration() BOOST_NOEXCEPT {
--m_finish;
int_type const digit = static_cast<int_type>(m_value % 10U);
Traits::assign(*m_finish, Traits::to_char_type(m_zero + digit));
m_value /= 10;
return !!m_value; // suppressing warnings
}
• Неизвестно количество итераций на момент компиляции.
Орлов Роман Догнать и перегнать boost::lexical_cast
11. 5/25
Под капотом boost::lexical_cast
Итерационное решение
inline CharT* main_convert_loop() BOOST_NOEXCEPT {
while (main_convert_iteration());
return m_finish;
}
inline bool main_convert_iteration() BOOST_NOEXCEPT {
--m_finish;
int_type const digit = static_cast<int_type>(m_value % 10U);
Traits::assign(*m_finish, Traits::to_char_type(m_zero + digit));
m_value /= 10;
return !!m_value; // suppressing warnings
}
• Неизвестно количество итераций на момент компиляции.
• Вычисление веса каждого разряда, начиная с младшего.
Для числа 90000000000000000000 необходимо 20 раз вычислять веса
разрядов.
Орлов Роман Догнать и перегнать boost::lexical_cast
12. 6/25
Под капотом boost::lexical_cast
Проблема временного буфера
template <std::size_t N, class ArrayT>
bool shr_std_array(ArrayT& output) BOOST_NOEXCEPT {
using namespace std;
const std::size_t size = static_cast<std::size_t>(finish - start);
if (size > N - 1) { // ‘-1‘ because we need to store 0 at the end
return false;
}
memcpy(&output[0], start, size * sizeof(CharT));
output[size] = Traits::to_char_type(0);
return true;
}
• Использование временного буфера с последующим копированием.
• Сложность O(2N), где N – количество разрядов в числе.
Орлов Роман Догнать и перегнать boost::lexical_cast
13. 7/25
Под капотом karma::generate
Рекурсивное решение без временного буфера
template <typename OutputIterator, typename T>
static bool call(OutputIterator& sink, T n, T& num, int exp) {
int ch = radix_type::call(remainder_type::call(n));
n = divide_type::call(n, num, ++exp);
BOOST_PP_REPEAT(BOOST_KARMA_NUMERICS_LOOP_UNROLL,
BOOST_KARMA_NUMERICS_INNER_LOOP_PREFIX, _);
if (!traits::test_zero(n))
call(sink, n, num, exp);
BOOST_PP_REPEAT(BOOST_KARMA_NUMERICS_LOOP_UNROLL,
BOOST_KARMA_NUMERICS_INNER_LOOP_SUFFIX, _);
*sink = char(ch);
++sink;
return true;
}
Орлов Роман Догнать и перегнать boost::lexical_cast
14. 7/25
Под капотом karma::generate
Рекурсивное решение без временного буфера
template <typename OutputIterator, typename T>
static bool call(OutputIterator& sink, T n, T& num, int exp) {
int ch = radix_type::call(remainder_type::call(n));
n = divide_type::call(n, num, ++exp);
BOOST_PP_REPEAT(BOOST_KARMA_NUMERICS_LOOP_UNROLL,
BOOST_KARMA_NUMERICS_INNER_LOOP_PREFIX, _);
if (!traits::test_zero(n))
call(sink, n, num, exp);
BOOST_PP_REPEAT(BOOST_KARMA_NUMERICS_LOOP_UNROLL,
BOOST_KARMA_NUMERICS_INNER_LOOP_SUFFIX, _);
*sink = char(ch);
++sink;
return true;
}
#define BOOST_KARMA_NUMERICS_INNER_LOOP_PREFIX(z, x, data)
if (!traits::test_zero(n)) {
int ch = radix_type::call(remainder_type::call(n));
n = divide_type::call(n, num, ++exp);
#define BOOST_KARMA_NUMERICS_INNER_LOOP_SUFFIX(z, x, data)
*sink = char(ch);
++sink;
}
Орлов Роман Догнать и перегнать boost::lexical_cast
15. 8/25
Требования к алгоритму
• Без динамического выделения памяти
• Известно число итераций на момент компиляции
• Получение результата без промежуточной буферизации
• Поддержка итераторов
Орлов Роман Догнать и перегнать boost::lexical_cast
16. 9/25
[int2str] На верхнем уровне
template<typename T, typename Iter>
inline Iter convert(T x, Iter iter)
{
static_assert(std::is_integral<T>::value,
”T must be integral type”);
return impl::converter<typename std::decay<T>::type>::run(x, iter);
}
T – целочисленный тип,
Iter – forward-итератор, для которого применимо *iter = char()
template<typename T, typename Iter>
inline Iter convert_c_str(T x, Iter iter)
{
iter = convert(x, iter);
*iter++ = 0;
return iter;
}
Орлов Роман Догнать и перегнать boost::lexical_cast
17. 10/25
[int2str] Основной алгоритм
Поиск первого делителя
template<number_t N>
struct detail
{
template<typename Iter>
inline static Iter convert(number_t x, Iter iter)
{
if (N > x)
return detail<N / 10u>::convert(x, iter);
return detail<N>::convert_step(x, iter);
}
template<typename Iter>
inline static Iter convert_step(number_t x, Iter iter);
};
N – делитель для получения веса старшего разряда,
N = 10000000000000000000, 1000000000000000000, . . . , 100, 10, 1
Орлов Роман Догнать и перегнать boost::lexical_cast
18. 11/25
[int2str] Основной алгоритм
Генерация строки
template<number_t N>
template<typename Iter>
Iter detail<N>::convert_step(number_t x, Iter iter)
{
if (N > x)
{
*iter++ = ’0’;
return detail<N / 10u>::convert_step(x, iter);
}
auto const w = x / N; // <-- DIVISION BY CONSTANT
*iter++ = static_cast<char>(’0’ + w);
return detail<N / 10u>::convert_step(x - w * N, iter);
}
• Веса разрядов вычисляются от старших к младшим.
• Чем больше в числе нулевых разрядов, тем быстрее работает
алгоритм.
Орлов Роман Догнать и перегнать boost::lexical_cast
19. 12/25
[int2str] Основной алгоритм
Конец генерации строки
template<>
struct detail<1u>
{
template<typename Iter>
inline static Iter convert(number_t x, Iter iter)
{
return convert_step(x, iter);
}
template<typename Iter>
inline static Iter convert_step(number_t x, Iter iter)
{
*iter++ = static_cast<char>(’0’ + x);
return iter;
}
};
Орлов Роман Догнать и перегнать boost::lexical_cast
20. 13/25
[int2str] Плохое решение
Выбор делителя N
template<typename T, typename Iter>
Iter convert(T x, Iter iter)
{
return detail< ? >()>::convert(x, iter); // What N should be here?
}
Орлов Роман Догнать и перегнать boost::lexical_cast
21. 13/25
[int2str] Плохое решение
Выбор делителя N
template<typename T, typename Iter>
Iter convert(T x, Iter iter)
{
return detail< ? >()>::convert(x, iter); // What N should be here?
}
Пусть N=10000000000000000000, делителю наибольшего числа.
Орлов Роман Догнать и перегнать boost::lexical_cast
22. 13/25
[int2str] Плохое решение
Выбор делителя N
template<typename T, typename Iter>
Iter convert(T x, Iter iter)
{
return detail< ? >()>::convert(x, iter); // What N should be here?
}
Пусть N=10000000000000000000, делителю наибольшего числа.
При T=unsigned char и x=42 получим
detail<10000000000000000000>::convert(x, iter)
Для поиска первого делителя числа x, т.е.
detail<10>::convert(x, iter)
будет выполнено 18 сравнений N>x.
Орлов Роман Догнать и перегнать boost::lexical_cast
23. 14/25
[int2str] Максимальный делитель по типу
Предопределенные константы
template<size_t N>
constexpr number_t get_max_divider();
template<>
constexpr number_t get_max_divider<1u>()
{
return 100u;
}
template<>
constexpr number_t get_max_divider<2u>()
{
return 10000u;
}
…
Орлов Роман Догнать и перегнать boost::lexical_cast
25. 15/25
[int2str] Максимальный делитель по типу
Вычисление на этапе компиляции
template<typename T>
constexpr number_t get_max_divider(number_t n = 1)
{
return (std::numeric_limits<T>::max() / n <= 9 ? n
: get_max_divider<T>(n * 10));
}
Орлов Роман Догнать и перегнать boost::lexical_cast
26. 15/25
[int2str] Максимальный делитель по типу
Вычисление на этапе компиляции
template<typename T>
constexpr number_t get_max_divider(number_t n = 1)
{
return (std::numeric_limits<T>::max() / n <= 9 ? n
: get_max_divider<T>(n * 10));
}
template<typename T, typename Iter>
Iter convert(T x, Iter iter)
{
return detail<get_max_divider<T>()>::convert(x, iter);
}
Орлов Роман Догнать и перегнать boost::lexical_cast
27. 15/25
[int2str] Максимальный делитель по типу
Вычисление на этапе компиляции
template<typename T>
constexpr number_t get_max_divider(number_t n = 1)
{
return (std::numeric_limits<T>::max() / n <= 9 ? n
: get_max_divider<T>(n * 10));
}
template<typename T, typename Iter>
Iter convert(T x, Iter iter)
{
return detail<get_max_divider<T>()>::convert(x, iter);
}
При T=uint64_t и x=42 получим
detail<10000000000000000000>::convert(x, iter)
Для поиска первого делителя x снова выполним 18 сравнений N>x.
Орлов Роман Догнать и перегнать boost::lexical_cast
28. 16/25
[int2str] Итерация по типам
Введем метафункцию next_type(T) = U, T ∈ I, U ∈ I,
I – множество беззнаковых целых типов, sizeof(T) ≤ sizeof(U).
Если T ∼ U, то T – тип максимального размера.
template<typename T>
struct next_type {
typedef unsigned long long type;
};
Орлов Роман Догнать и перегнать boost::lexical_cast
29. 16/25
[int2str] Итерация по типам
Введем метафункцию next_type(T) = U, T ∈ I, U ∈ I,
I – множество беззнаковых целых типов, sizeof(T) ≤ sizeof(U).
Если T ∼ U, то T – тип максимального размера.
template<typename T>
struct next_type {
typedef unsigned long long type;
};
template<>
struct next_type<unsigned char> { // sizeof(char) < sizeof(short)
typedef unsigned short type;
};
template<>
struct next_type<unsigned short> { // sizeof(short) < sizeof(int)
typedef unsigned int type;
};
Орлов Роман Догнать и перегнать boost::lexical_cast
30. 16/25
[int2str] Итерация по типам
Введем метафункцию next_type(T) = U, T ∈ I, U ∈ I,
I – множество беззнаковых целых типов, sizeof(T) ≤ sizeof(U).
Если T ∼ U, то T – тип максимального размера.
template<typename T>
struct next_type {
typedef unsigned long long type;
};
template<>
struct next_type<unsigned char> { // sizeof(char) < sizeof(short)
typedef unsigned short type;
};
template<>
struct next_type<unsigned short> { // sizeof(short) < sizeof(int)
typedef unsigned int type;
};
Для остальных типов специализации не нужны
next_type<unsigned int> → unsigned long long
next_type<unsigned long long> → unsigned long long
Орлов Роман Догнать и перегнать boost::lexical_cast
31. 17/25
[int2str] Выбор наиболее близкого делителя
template<typename FromT=unsigned char,
typename T,
typename Iter>
inline Iter convert_from(T x, Iter iter)
{
if (x <= std::numeric_limits<FromT>::max())
return detail<get_max_divider<FromT>()>::convert(x, iter);
return convert_from<typename next_type<FromT>::type>(x, iter);
}
Если T=uint64_t и x=42, то при вызове
convert_from<unsigned char>(x, iter)
будет использована специализация
detail<100>::convert(x, iter)
вместо первоначальной
detail<10000000000000000000>::convert(x, iter)
Орлов Роман Догнать и перегнать boost::lexical_cast
32. 18/25
[int2str] Реализация конвертера
template<typename T, typename Enable=void>
struct converter
{
template<typename Iter>
inline static Iter run(T x, Iter iter) {
return convert_from(x, iter);
}
};
Орлов Роман Догнать и перегнать boost::lexical_cast
33. 18/25
[int2str] Реализация конвертера
template<typename T, typename Enable=void>
struct converter
{
template<typename Iter>
inline static Iter run(T x, Iter iter) {
return convert_from(x, iter);
}
};
template<typename T>
struct converter< T,
typename std::enable_if<std::is_signed<T>::value>::type>
{
template<typename Iter>
inline static Iter run(T x, Iter iter) {
using U = typename std::make_unsigned<T>::type;
if (x < 0) {
*iter++ = ’-’;
return convert_from(static_cast<U>(-x), iter);
}
return convert_from(static_cast<U>(x), iter);
}
};
Орлов Роман Догнать и перегнать boost::lexical_cast
34. 19/25
Результаты тестирования
Компиляторы и библиотеки
GCC 6
• GCC 6.2.1 20160916
Clang
• Clang 3.8.0 (tags/RELEASE_380/final)
MS Visual Studio 2015
• CL 19.00.24215.1
Boost
• Boost 1.62.0, September 28th, 2016 15:17 GMT
Орлов Роман Догнать и перегнать boost::lexical_cast
35. 20/25
Результаты тестирования
Синтетический случай
Для всех xi = i, i = INT_MIN, . . . , INT_MAX
clang -O3 gcc -O3 clang -O2 gcc -O2 msvc /O2 /GL
0
200
400
600
2 2 2 2 2
100 101 99 100 112
264
378
260
379
635
255
435
366
436
286
t,с
null int2str::convert boost::lexical_cast karma::generate
Орлов Роман Догнать и перегнать boost::lexical_cast
36. 21/25
Результаты тестирования
Общий случай
Для всех xi = random(INT_MIN, INT_MAX), i = 1, . . . , 10000000
clang -O3 gcc -O3 clang -O2 gcc -O2 msvc /O2 /GL
0
2
4
6
8
10
1.53 1.59 1.55 1.59
9.13
2.1 2.18 2.09 2.36
9.65
2.28 2.54 2.29 2.53
10.69
2.21
2.75 2.48 2.73
9.86
t,с
null int2str::convert boost::lexical_cast karma::generate
Орлов Роман Догнать и перегнать boost::lexical_cast
37. 22/25
Особенности компиляции
int2str::convert VS boost::lexical_cast ON clang -O3
int2str::convert(9001,…)
mov ax,di
movzx ecx,ax
cmp edi,0xff
ja 0x400a38
0x400a38 cmp ecx,0x270f
ja XXXX
cmp ecx,0x3e7
ja 0x400af2
0x400af2 jmp 0x400b00
0x400b00 cmp rdi,0x3e7
ja 0x400b1b
0x400b1b mov rax,rdi
shr rax,0x3
movabs rcx,0x20c49ba5e353f7cf
mul rcx
shr rdx,0x4
lea eax,[rdx+0x30]
mov BYTE PTR [rsi],al
imul rcx,rdx,0xfffffffffffffc18
add rcx,rdi
cmp rcx,0x63
ja XXXX
mov BYTE PTR [rsi+0x1],0x30
cmp rcx,0x9
ja XXXX
mov BYTE PTR [rsi+0x2],0x30
add rcx,0x30
mov BYTE PTR [rsi+0x3],cl
jmp 0x400c51
0x400c51 add rsi,0x4
mov rax,rsi
Орлов Роман Догнать и перегнать boost::lexical_cast
38. 22/25
Особенности компиляции
int2str::convert VS boost::lexical_cast ON clang -O3
int2str::convert(9001,…)
mov ax,di
movzx ecx,ax
cmp edi,0xff
ja 0x400a38
0x400a38 cmp ecx,0x270f
ja XXXX
cmp ecx,0x3e7
ja 0x400af2
0x400af2 jmp 0x400b00
0x400b00 cmp rdi,0x3e7
ja 0x400b1b
0x400b1b mov rax,rdi
shr rax,0x3
movabs rcx,0x20c49ba5e353f7cf
mul rcx
shr rdx,0x4
lea eax,[rdx+0x30]
mov BYTE PTR [rsi],al
imul rcx,rdx,0xfffffffffffffc18
add rcx,rdi
cmp rcx,0x63
ja XXXX
mov BYTE PTR [rsi+0x1],0x30
cmp rcx,0x9
ja XXXX
mov BYTE PTR [rsi+0x2],0x30
add rcx,0x30
mov BYTE PTR [rsi+0x3],cl
jmp 0x400c51
0x400c51 add rsi,0x4
mov rax,rsi
boost::lexical_cast<…>(9001)
0x401390 mov rdx,QWORD PTR [rbx+0x8]
lea rsi,[rdx-0x1]
mov QWORD PTR [rbx+0x8],rsi
mov esi,ecx
imul rsi,rax
shr rsi,0x23
add esi,esi
lea esi,[rsi+rsi*4]
sub ecx,esi
add ecx,DWORD PTR [rbx+0x14]
mov BYTE PTR [rdx-0x1],cl
movsxd rdx,DWORD PTR [rbx]
imul rcx,rdx,0x66666667
mov rsi,rcx
shr rsi,0x3f
sar rcx,0x22
add ecx,esi
mov DWORD PTR [rbx],ecx
lea edx,[rdx+0x9]
cmp edx,0x12
ja 0x401390
Орлов Роман Догнать и перегнать boost::lexical_cast
39. 22/25
Особенности компиляции
int2str::convert VS boost::lexical_cast ON clang -O3
int2str::convert(9001,…)
mov ax,di
movzx ecx,ax
cmp edi,0xff
ja 0x400a38
0x400a38 cmp ecx,0x270f
ja XXXX
cmp ecx,0x3e7
ja 0x400af2
0x400af2 jmp 0x400b00
0x400b00 cmp rdi,0x3e7
ja 0x400b1b
0x400b1b mov rax,rdi
shr rax,0x3
movabs rcx,0x20c49ba5e353f7cf
mul rcx
shr rdx,0x4
lea eax,[rdx+0x30]
mov BYTE PTR [rsi],al
imul rcx,rdx,0xfffffffffffffc18
add rcx,rdi
cmp rcx,0x63
ja XXXX
mov BYTE PTR [rsi+0x1],0x30
cmp rcx,0x9
ja XXXX
mov BYTE PTR [rsi+0x2],0x30
add rcx,0x30
mov BYTE PTR [rsi+0x3],cl
jmp 0x400c51
0x400c51 add rsi,0x4
mov rax,rsi
boost::lexical_cast<…>(9001)
0x401390 mov rdx,QWORD PTR [rbx+0x8]
lea rsi,[rdx-0x1]
mov QWORD PTR [rbx+0x8],rsi
mov esi,ecx
imul rsi,rax
shr rsi,0x23
add esi,esi
lea esi,[rsi+rsi*4]
sub ecx,esi
add ecx,DWORD PTR [rbx+0x14]
mov BYTE PTR [rdx-0x1],cl
movsxd rdx,DWORD PTR [rbx]
imul rcx,rdx,0x66666667
mov rsi,rcx
shr rsi,0x3f
sar rcx,0x22
add ecx,esi
mov DWORD PTR [rbx],ecx
lea edx,[rdx+0x9]
cmp edx,0x12
ja 0x401390
x4
Орлов Роман Догнать и перегнать boost::lexical_cast
41. 24/25
Итоги
#include <int2str/int2str.hpp>
#include <string>
#include <iostream>
int main()
{
std::string msg = ”C++ Russia ”;
int2str::convert(2017, std::back_inserter(msg));
std::cout << msg << std::endl;
return 0;
}
Нет динамического выделения памяти.
На момент компиляции известно число итераций.
Результат формируется без промежуточной буферизации.
Работа через итераторы.
Быстрее boost::lexical_cast.
Орлов Роман Догнать и перегнать boost::lexical_cast