SlideShare a Scribd company logo
Эффективный C++
Андрей Карпов
CTO, Microsoft MVP, к.ф.-м.н.,
karpov@viva64.com
•IBM RPG - язык
программирования, синтаксис
которого был изначально сходен
с командным языком
механических табуляторов
компании IBM
•Широко использовался в 1960-х
и 1970-х годах
IBM 1401
Жив ли С и C++? Да что там, жив IBM RPG!
break в switch: проблема
....
case ADDRESS_HOME_LINE3:
group = GROUP_ADDRESS_LINE_3;
break;
case ADDRESS_HOME_STREET_ADDRESS:
group = GROUP_STREET_ADDRESS;
case ADDRESS_HOME_CITY:
group = GROUP_ADDRESS_CITY;
break;
case ADDRESS_HOME_STATE:
group = GROUP_ADDRESS_STATE;
break;
....
Chromium
break в switch: большая проблема
• Qt
• GDB
• Redis
• EA WebKit
• Unreal Engine 4
• Chromium
• ....
break в switch: промежуточные решения
• MISRA С: непустой case надо всегда завершать
оператором break
• [[gnu::fallthrough]]
• [[clang::fallthrough]]
• __attribute__((fallthrough))
• BOOST_FALLTHROUGH
break в switch: [[fallthrough]]
switch (i)
{
case 10:
f1();
break;
case 20:
f2();
break;
case 30:
f3();
[[fallthrough]]; // Предупреждение будет подавлено
case 40:
f4();
break;
Clang, GCC: -Wimplicit-fallthrough
С++17: удаленные возможности
• Удалены триграфы
• Ключевое слово register больше нельзя
использовать как спецификатор переменной
• Удалены префиксный и постфиксный инкременты
для типа bool
• Диагностика V552 в анализаторе PVS-Studio станет неактуальной
• Удален std::auto_ptr, вместо него стоит
использовать std::unique_ptr
??= #
??/ 
??' ^
??( [
??) ]
??! |
??< {
??> }
??- ~
Неконстантный string::data
• В C++17 у std::string появился метод data(),
возвращающий неконстантный указатель на внутренние
данные строки.
• Теперь я верю, что о нас заботятся по настоящему.
Решена ПРАКТИЧЕСКАЯ задача.
Писать &str.front() and &str[0] было некрасиво.
std::string str = "hello";
char *p = str.data();
p[0] = 'H';
std::cout << str << 'n'; // Hello
Новый атрибут [[nodiscard]]
[[nodiscard]] int Sum(int a, int b)
{
return a + b;
}
int main()
{
Sum(5, 6); // Будет выдано предупреждение
// компилятора/анализатора
return 0;
}
Свой класс строки - это норма
• Рано или поздно, в любом
состоявшемся проекте появляется свой
класс строки.
• Я ждал, появится ли он в PVS-Studio.
• Он появился, и это было обосновано.
• Это нормально. Не стесняйтесь это
делать.
Из моего доклада на C++ Russia 2016
std::string
• C++ Russia 2017: Антон Полухин, Как делать не надо: C++
велосипедостроение для профессионалов
https://youtu.be/rJWSSWYL83U
• vstring
• std::string
Constexpr if
template <typename T>
auto GetValue(T t)
{
if constexpr (std::is_pointer<T>::value)
{
return *t;
}
else
{
return t;
}
}
void foo()
{
int v = 10;
std::cout << GetValue(v) << 'n'; // 10
std::cout << GetValue(&v) << 'n'; // 10
}
Инициализатор в if и switch
if ((len=input.find("length=",start)!=std::string::npos))
length=atoi(&(input.c_str()[len+strlen("length=")]));
SETI@home
Инициализатор в if и switch
if (auto it = m.find(key); it != m.end())
{
....
}
__has_include
#if __has_include(<optional>)
#include <optional>
#define have_optional 1
#elif __has_include(<experimental/optional>)
#include <experimental/optional>
#define have_optional 1
#define experimental_optional 1
#else
#define have_optional 0
#endif
С++17: и так далее
• Рекомендую статью моего коллеги Егора Бредихина
"C++17"
https://www.viva64.com/ru/b/0533/
Зрелость инструментария
• Компиляторы
• Среды для разработки
• Динамические анализаторы
• Статические анализаторы
Динамические анализаторы
• Классика:
• Valgrind
• BoundsChecker
• Intel Parallel Inspector
• Новинки от Google:
• AddressSanitizer
• ThreadSanitizer
• MemorySanitizer
Статические анализаторы кода
• Coverity
• Klocwork
• Parasoft
• PVS-Studio
• SonarQube
• "Имя им легион": List of tools for static code analysis
https://en.wikipedia.org/wiki/List_of_tools_for_static_code_
analysis
Современный C++ не избавляет от
необходимости статического анализа
TDLib (C++)void FileGcWorker::run_gc(....,
std::vector<FullFileInfo> files, ....)
{
....
std::sort(files.begin(), files.end(),
[](const auto &a, const auto &b)
{
return a.atime_nsec < a.atime_nsec;
});
....
}
Статический анализ, это не заплатка для C
и C++
static bool AreEqual(VisualStyleElement value1,
VisualStyleElement value2)
{
return
value1.ClassName == value1.ClassName &&
value1.Part == value2.Part &&
value1.State == value2.State;
}
Mono (C#)
PVS-Studio
• Хочу пригласить Михаила Матросова
• Технический менеджер в московском R&D офисе компании Align
Technology
Общая информация
• Align Technology R&D
• 1.5M LOC C++
• Включая очень пыльный легаси :)
• 150 коммитов в день
• 5 разработчиков в месяц :)
Автоматизация
• CI сервер (Bamboo)
• Дневной билд на инкрементальный анализ (около 15 минут)
• Ночной билд на полный анализ (около 6 часов)
• L3 не проверяются
Процесс с точки зрения разработчика
• Заливаю изменения в транк
• На CI сервере автоматически запускается билд с
инкрементальным анализом
• Если анализ выявит нарушения PVS-Studio, я получаю
уведомление
• Исправляю нарушения. Могу проверить локально. Заливаю.
Процесс с точки зрения внедряльщика
• Каждое утро проверяю результаты полного анализа
• Если есть нарушения, значит либо
• кто-то из разработчиков пропустил уведомление, в этом случае пишу ему
письмо с напоминанием
• что-то пошло не так в процессе анализа, либо уведомление не было
послано, в этом случае разбираюсь
• Если какой-то разработчик часто пропускает уведомления,
провожу воспитательно-просветительскую беседу
Внедрение
• Полный анализ исходников
• Анализ каждого правила – насколько оно применимо на нашей
кодобазе
• Если правило даёт слишком много ложноположительных срабатываний,
оно убирается из анализа с помощью .pvsconfig файла
• Небольшое количество самых страшных нарушений исправить
сразу
• Все остальные нарушения подавить
Общее впечатление
• Инструмент достаточно прост во внедрении и конфигурации.
• Помог найти множество реальных проблем. Процесс налажен и
работает достаточно хорошо.
• Авторы быстро отвечают, оперативно фиксят проблемы. Могут
реализовать фичу по запросу.
• Анализатор частенько ошибается на сложном С++ коде.
Сказывается отсутствие проверенного парсера (clang). Нет
ощущения, что в дальнейшем это будет улучшаться. Сейчас
кажется, что подкладываются костыли по мере необходимости.
Ускорение сборки: распределённая
компиляция
• IncrediBuild - https://www.incredibuild.com/
• distcc - https://github.com/distcc/distcc
• Icecream - https://github.com/icecc/icecream
Ускорение сборки: кэш компилятора
• При компиляции препроцессированного файла на основе
его содержимого, флагов компиляции, вывода
компилятора, вычисляется хэш-значение
• При повторной компиляции с теми же флагами
неизмененного файла, из кэша будет взят уже готовый
объектный файл и подан на вход компоновщика
Ускорение сборки: кэш компилятора
Ускорение сборки: кэш компилятора
•Для Unix-подобных систем:
• ccache (GCC, Clang) - https://ccache.samba.org/
• cachecc1 (GCC) - http://cachecc1.sourceforge.net/
•Для Windows:
• clcache (MSVC) - https://github.com/frerich/clcache
• cclash (MSVC) - https://github.com/inorton/cclash
Ускорение сборки: замена
компонентов трансляции
• Многократное ускорение перекомпиляции проектов
• Zapcc vs Clang
Ускорение сборки: модули
• Ждём C++20
Инструменты профайлинга С++ кода
• Как говорится «передам по ссылке» ваше внимание вот этому
докладу
• Александр Зайцев. Инструменты профайлинга С++ кода.
Минск, конференция C++ CoreHard Spring 2018
• Видео станет доступно на YouTube через 3 месяца
И так далее
• C++ Core Guidelines
• Комьюнити, конференции
• Рынок труда
Ответы на вопросы
Андрей Карпов karpov@viva64.com
Сайт PVS-Studio https://www.viva64.com
Twitter @Code_Analysis

More Related Content

PDF
Павел Довгалюк, Обратная отладка
PPTX
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
PPTX
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
PDF
Андрей Карпов, Приватные байки от разработчиков анализатора кода
PDF
Для чего мы делали свой акторный фреймворк и что из этого вышло?
PPTX
Основы и применение статического анализа кода при разработке лекция 1
PPTX
Евгений Зуев, С++ в России: Стандарт языка и его реализация
PPTX
C++ Core Guidelines
Павел Довгалюк, Обратная отладка
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Основы и применение статического анализа кода при разработке лекция 1
Евгений Зуев, С++ в России: Стандарт языка и его реализация
C++ Core Guidelines

What's hot (19)

PDF
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
PPTX
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
PDF
Борис Сазонов, RAII потоки и CancellationToken в C++
PPTX
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
PDF
Нескучное тестирование с pytest
PDF
Теория языков программирования некоторые слайды к лекциям
PPTX
Статический анализ кода: борьба с удорожанием ошибок
PPTX
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
PDF
Цена ошибки
PPTX
ADD 2011: Статический анализ Си++ кода
PPTX
Иван Стеценко: ЯП Zephir. Панацея или лечение?
PPTX
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
KEY
Worried code
PPTX
PVS-Studio, решение для разработки современных ресурсоемких приложений
PDF
Component Inspector
PPTX
Опыт эксплуатации большого проекта на Ruby
PDF
Учим автотесты человеческому языку с помощью Allure и PyTest
ODP
Top10 доводов против языка Ruby
PPTX
Sampling profiling
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Борис Сазонов, RAII потоки и CancellationToken в C++
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
Нескучное тестирование с pytest
Теория языков программирования некоторые слайды к лекциям
Статический анализ кода: борьба с удорожанием ошибок
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
Цена ошибки
ADD 2011: Статический анализ Си++ кода
Иван Стеценко: ЯП Zephir. Панацея или лечение?
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Worried code
PVS-Studio, решение для разработки современных ресурсоемких приложений
Component Inspector
Опыт эксплуатации большого проекта на Ruby
Учим автотесты человеческому языку с помощью Allure и PyTest
Top10 доводов против языка Ruby
Sampling profiling
Ad

Similar to Эффективный C++ (20)

PPTX
Улучшение качества открытого программного обеспечения с помощью инструментов ...
PDF
Разница в подходах анализа кода компилятором и выделенным инструментом
PPTX
Принципы работы статического анализатора кода PVS-Studio
PPTX
Великий и могучий C++
PPTX
Статический анализ кода: современный взгляд
PPTX
Статический анализ кода: Что? Как? Зачем?
PPTX
Опыт разработки статического анализатора кода
PPTX
Не связывайтесь с поддержкой C++ программистов. Юрий Минаев. CoreHard Spring ...
PPTX
Выявление ошибок и потенциальных уязвимостей в C и C++ коде с помощью анализа...
PPTX
Современный статический анализ кода: что умеет он, чего не умели линтеры
PDF
Реклама PVS-Studio - статический анализ кода на языке Си и Си++
PPTX
SAST и Application Security: как бороться с уязвимостями в коде
PPTX
Ошибки, которые сложно заметить на code review, но которые находятся статичес...
PPTX
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
PPTX
Павел Беликов, Как избежать ошибок, используя современный C++
PDF
Трудности сравнения анализаторов кода или не забывайте об удобстве использования
PDF
Незаменимый С++. Антон Полухин. CoreHard Spring 2019
PPTX
Что могут статические анализаторы, чего не могут программисты и тестировщики
PDF
Правила статического анализа кода для диагностики потенциально опасных констр...
PPTX
Статический анализ: ищем ошибки... и уязвимости?
Улучшение качества открытого программного обеспечения с помощью инструментов ...
Разница в подходах анализа кода компилятором и выделенным инструментом
Принципы работы статического анализатора кода PVS-Studio
Великий и могучий C++
Статический анализ кода: современный взгляд
Статический анализ кода: Что? Как? Зачем?
Опыт разработки статического анализатора кода
Не связывайтесь с поддержкой C++ программистов. Юрий Минаев. CoreHard Spring ...
Выявление ошибок и потенциальных уязвимостей в C и C++ коде с помощью анализа...
Современный статический анализ кода: что умеет он, чего не умели линтеры
Реклама PVS-Studio - статический анализ кода на языке Си и Си++
SAST и Application Security: как бороться с уязвимостями в коде
Ошибки, которые сложно заметить на code review, но которые находятся статичес...
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
Павел Беликов, Как избежать ошибок, используя современный C++
Трудности сравнения анализаторов кода или не забывайте об удобстве использования
Незаменимый С++. Антон Полухин. CoreHard Spring 2019
Что могут статические анализаторы, чего не могут программисты и тестировщики
Правила статического анализа кода для диагностики потенциально опасных констр...
Статический анализ: ищем ошибки... и уязвимости?
Ad

More from Andrey Karpov (20)

PDF
60 антипаттернов для С++ программиста
PDF
60 terrible tips for a C++ developer
PDF
PVS-Studio in 2021 - Error Examples
PDF
PVS-Studio in 2021 - Feature Overview
PDF
PVS-Studio в 2021 - Примеры ошибок
PDF
PVS-Studio в 2021
PPTX
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...
PPTX
Best Bugs from Games: Fellow Programmers' Mistakes
PPTX
Does static analysis need machine learning?
PPTX
Typical errors in code on the example of C++, C#, and Java
PPTX
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)
PPTX
Game Engine Code Quality: Is Everything Really That Bad?
PPTX
C++ Code as Seen by a Hypercritical Reviewer
PPTX
The Use of Static Code Analysis When Teaching or Developing Open-Source Software
PPTX
Static Code Analysis for Projects, Built on Unreal Engine
PPTX
Safety on the Max: How to Write Reliable C/C++ Code for Embedded Systems
PPTX
The Great and Mighty C++
PPTX
Static code analysis: what? how? why?
PDF
Zero, one, two, Freddy's coming for you
PDF
PVS-Studio Is Now in Chocolatey: Checking Chocolatey under Azure DevOps
60 антипаттернов для С++ программиста
60 terrible tips for a C++ developer
PVS-Studio in 2021 - Error Examples
PVS-Studio in 2021 - Feature Overview
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...
Best Bugs from Games: Fellow Programmers' Mistakes
Does static analysis need machine learning?
Typical errors in code on the example of C++, C#, and Java
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)
Game Engine Code Quality: Is Everything Really That Bad?
C++ Code as Seen by a Hypercritical Reviewer
The Use of Static Code Analysis When Teaching or Developing Open-Source Software
Static Code Analysis for Projects, Built on Unreal Engine
Safety on the Max: How to Write Reliable C/C++ Code for Embedded Systems
The Great and Mighty C++
Static code analysis: what? how? why?
Zero, one, two, Freddy's coming for you
PVS-Studio Is Now in Chocolatey: Checking Chocolatey under Azure DevOps

Эффективный C++

  • 2. •IBM RPG - язык программирования, синтаксис которого был изначально сходен с командным языком механических табуляторов компании IBM •Широко использовался в 1960-х и 1970-х годах IBM 1401 Жив ли С и C++? Да что там, жив IBM RPG!
  • 3. break в switch: проблема .... case ADDRESS_HOME_LINE3: group = GROUP_ADDRESS_LINE_3; break; case ADDRESS_HOME_STREET_ADDRESS: group = GROUP_STREET_ADDRESS; case ADDRESS_HOME_CITY: group = GROUP_ADDRESS_CITY; break; case ADDRESS_HOME_STATE: group = GROUP_ADDRESS_STATE; break; .... Chromium
  • 4. break в switch: большая проблема • Qt • GDB • Redis • EA WebKit • Unreal Engine 4 • Chromium • ....
  • 5. break в switch: промежуточные решения • MISRA С: непустой case надо всегда завершать оператором break • [[gnu::fallthrough]] • [[clang::fallthrough]] • __attribute__((fallthrough)) • BOOST_FALLTHROUGH
  • 6. break в switch: [[fallthrough]] switch (i) { case 10: f1(); break; case 20: f2(); break; case 30: f3(); [[fallthrough]]; // Предупреждение будет подавлено case 40: f4(); break; Clang, GCC: -Wimplicit-fallthrough
  • 7. С++17: удаленные возможности • Удалены триграфы • Ключевое слово register больше нельзя использовать как спецификатор переменной • Удалены префиксный и постфиксный инкременты для типа bool • Диагностика V552 в анализаторе PVS-Studio станет неактуальной • Удален std::auto_ptr, вместо него стоит использовать std::unique_ptr ??= # ??/ ??' ^ ??( [ ??) ] ??! | ??< { ??> } ??- ~
  • 8. Неконстантный string::data • В C++17 у std::string появился метод data(), возвращающий неконстантный указатель на внутренние данные строки. • Теперь я верю, что о нас заботятся по настоящему. Решена ПРАКТИЧЕСКАЯ задача. Писать &str.front() and &str[0] было некрасиво. std::string str = "hello"; char *p = str.data(); p[0] = 'H'; std::cout << str << 'n'; // Hello
  • 9. Новый атрибут [[nodiscard]] [[nodiscard]] int Sum(int a, int b) { return a + b; } int main() { Sum(5, 6); // Будет выдано предупреждение // компилятора/анализатора return 0; }
  • 10. Свой класс строки - это норма • Рано или поздно, в любом состоявшемся проекте появляется свой класс строки. • Я ждал, появится ли он в PVS-Studio. • Он появился, и это было обосновано. • Это нормально. Не стесняйтесь это делать. Из моего доклада на C++ Russia 2016
  • 11. std::string • C++ Russia 2017: Антон Полухин, Как делать не надо: C++ велосипедостроение для профессионалов https://youtu.be/rJWSSWYL83U • vstring • std::string
  • 12. Constexpr if template <typename T> auto GetValue(T t) { if constexpr (std::is_pointer<T>::value) { return *t; } else { return t; } } void foo() { int v = 10; std::cout << GetValue(v) << 'n'; // 10 std::cout << GetValue(&v) << 'n'; // 10 }
  • 13. Инициализатор в if и switch if ((len=input.find("length=",start)!=std::string::npos)) length=atoi(&(input.c_str()[len+strlen("length=")])); SETI@home
  • 14. Инициализатор в if и switch if (auto it = m.find(key); it != m.end()) { .... }
  • 15. __has_include #if __has_include(<optional>) #include <optional> #define have_optional 1 #elif __has_include(<experimental/optional>) #include <experimental/optional> #define have_optional 1 #define experimental_optional 1 #else #define have_optional 0 #endif
  • 16. С++17: и так далее • Рекомендую статью моего коллеги Егора Бредихина "C++17" https://www.viva64.com/ru/b/0533/
  • 17. Зрелость инструментария • Компиляторы • Среды для разработки • Динамические анализаторы • Статические анализаторы
  • 18. Динамические анализаторы • Классика: • Valgrind • BoundsChecker • Intel Parallel Inspector • Новинки от Google: • AddressSanitizer • ThreadSanitizer • MemorySanitizer
  • 19. Статические анализаторы кода • Coverity • Klocwork • Parasoft • PVS-Studio • SonarQube • "Имя им легион": List of tools for static code analysis https://en.wikipedia.org/wiki/List_of_tools_for_static_code_ analysis
  • 20. Современный C++ не избавляет от необходимости статического анализа TDLib (C++)void FileGcWorker::run_gc(...., std::vector<FullFileInfo> files, ....) { .... std::sort(files.begin(), files.end(), [](const auto &a, const auto &b) { return a.atime_nsec < a.atime_nsec; }); .... }
  • 21. Статический анализ, это не заплатка для C и C++ static bool AreEqual(VisualStyleElement value1, VisualStyleElement value2) { return value1.ClassName == value1.ClassName && value1.Part == value2.Part && value1.State == value2.State; } Mono (C#)
  • 22. PVS-Studio • Хочу пригласить Михаила Матросова • Технический менеджер в московском R&D офисе компании Align Technology
  • 23. Общая информация • Align Technology R&D • 1.5M LOC C++ • Включая очень пыльный легаси :) • 150 коммитов в день • 5 разработчиков в месяц :)
  • 24. Автоматизация • CI сервер (Bamboo) • Дневной билд на инкрементальный анализ (около 15 минут) • Ночной билд на полный анализ (около 6 часов) • L3 не проверяются
  • 25. Процесс с точки зрения разработчика • Заливаю изменения в транк • На CI сервере автоматически запускается билд с инкрементальным анализом • Если анализ выявит нарушения PVS-Studio, я получаю уведомление • Исправляю нарушения. Могу проверить локально. Заливаю.
  • 26. Процесс с точки зрения внедряльщика • Каждое утро проверяю результаты полного анализа • Если есть нарушения, значит либо • кто-то из разработчиков пропустил уведомление, в этом случае пишу ему письмо с напоминанием • что-то пошло не так в процессе анализа, либо уведомление не было послано, в этом случае разбираюсь • Если какой-то разработчик часто пропускает уведомления, провожу воспитательно-просветительскую беседу
  • 27. Внедрение • Полный анализ исходников • Анализ каждого правила – насколько оно применимо на нашей кодобазе • Если правило даёт слишком много ложноположительных срабатываний, оно убирается из анализа с помощью .pvsconfig файла • Небольшое количество самых страшных нарушений исправить сразу • Все остальные нарушения подавить
  • 28. Общее впечатление • Инструмент достаточно прост во внедрении и конфигурации. • Помог найти множество реальных проблем. Процесс налажен и работает достаточно хорошо. • Авторы быстро отвечают, оперативно фиксят проблемы. Могут реализовать фичу по запросу. • Анализатор частенько ошибается на сложном С++ коде. Сказывается отсутствие проверенного парсера (clang). Нет ощущения, что в дальнейшем это будет улучшаться. Сейчас кажется, что подкладываются костыли по мере необходимости.
  • 29. Ускорение сборки: распределённая компиляция • IncrediBuild - https://www.incredibuild.com/ • distcc - https://github.com/distcc/distcc • Icecream - https://github.com/icecc/icecream
  • 30. Ускорение сборки: кэш компилятора • При компиляции препроцессированного файла на основе его содержимого, флагов компиляции, вывода компилятора, вычисляется хэш-значение • При повторной компиляции с теми же флагами неизмененного файла, из кэша будет взят уже готовый объектный файл и подан на вход компоновщика
  • 31. Ускорение сборки: кэш компилятора
  • 32. Ускорение сборки: кэш компилятора •Для Unix-подобных систем: • ccache (GCC, Clang) - https://ccache.samba.org/ • cachecc1 (GCC) - http://cachecc1.sourceforge.net/ •Для Windows: • clcache (MSVC) - https://github.com/frerich/clcache • cclash (MSVC) - https://github.com/inorton/cclash
  • 33. Ускорение сборки: замена компонентов трансляции • Многократное ускорение перекомпиляции проектов • Zapcc vs Clang
  • 35. Инструменты профайлинга С++ кода • Как говорится «передам по ссылке» ваше внимание вот этому докладу • Александр Зайцев. Инструменты профайлинга С++ кода. Минск, конференция C++ CoreHard Spring 2018 • Видео станет доступно на YouTube через 3 месяца
  • 36. И так далее • C++ Core Guidelines • Комьюнити, конференции • Рынок труда
  • 37. Ответы на вопросы Андрей Карпов [email protected] Сайт PVS-Studio https://www.viva64.com Twitter @Code_Analysis