1.93M
Категория: ПрограммированиеПрограммирование

Продвинутые C++

1.

Продвинутые C++

2.

reinterpret_cast
• Как работает?
• В чем проблемы?
• Чем полезен?

3.

Самое простое применение
Вывод:
1 00111111100000000000000000000000
0x23e47ffb28 0x23e47ffb2c 4294967296

4.

Одно из полезных применений
Вывод:
Copy constructor of A
Copy constructor of A
Copy constructor of A
Constructed uninitialized
array
Constructed class A
Constructed class A
Constructed class A
Constructed class A
Constructed class A
Constructed class A
Constructed class A
Constructed class A
Constructed class A
Constructed class A

5.

dynamic_cast
Когда можно применить?
Как работает?
Особенности работы.
Чем полезен?

6.

Виды полиморфизма
• Статический (связывание методов объекта на этапе
компиляции)
• Динамический (связывание методов объекта на
этапе исполнения)

7.

Статический полиморфизм
В C++ можно реализовать через CRTP (Curiously
recurring template pattern). Применяется в Clang в AST
дереве.
Плюсы:
• Быстрее динамического
• Обычно требует меньше памяти
Но обычно не такой гибкий, как динамический

8.

Пример статического полиморфизма

9.

Динамический полиморфизм
В C++ реализуется с помощью виртуальных методов
Плюсы:
• Гибкий
• Крайне понятный
Минусы:
• Расходует память
• Медленный (ходим по всей памяти и чаще
промахиваемся в кэше)

10.

Динамический полиморфизм в памяти

11.

Динамический полиморфизм в памяти

12.

dynamic_cast

13.

dynamic_cast

14.

Проблема ромбовидного наследования

15.

Проблема ромбовидного наследования

16.

Проблема ромбовидного наследования

17.

А что в памяти?

18.

Перегрузка операторов new и delete

19.

Перегрузка операторов new и delete
Полезно для отладки выделения памяти, но крайне
сложные правила выбора перегрузки, которых 22 для
каждого оператора…
Для контейнеров лучше перегружать аллокаторы, но это
немного сложнее, но бывает полезнее.

20.

Итераторы

21.

Итераторы
Вывод:
1
0
3

22.

Итераторы
Вывод:
CE
1
-1

23.

Итераторы
English     Русский Правила