13:40 с незапамятных времён в C (под winavr) писал битовые маски через 0b и даже не задумывался, что это, оказывается, расширение языка. Но ещё бОльшим удивлением стало то, что в плюсах такая простая вещь появилась относительно недавно))
make_unique динамически аллоцирует объект типа T, идеально передавая список параметров в конструктор T, и сразу оборачивает указатель в std::unique_ptr. Польза заключается в следующих вещах: 1) теперь можно забыть об использовании new-delete в свежем коде. make_unique не требует написания new, а умный указатель освободит ресурсы, вызвав delete (или кастомный deleter). 2) make_unique безопасен для создания временных умных указателей в случае бросания исключений. Рассмотрим следующий код: foo(unique_ptr(new T()), unique_ptr(new U())); Порядок вычисления аргументов в С++ является неуточненным поведением (unspecified behavior). Порядок может быть таким: new T -> unique_ptr -> new U -> unique_ptr. А может быть и таким: new T -> new U -> unique_ptr -> unique_ptr. Во втором случае, если при аллокации U будет брошено исключение, то остается неосвобожденный ресурс T. make_uniqueрешает эту проблему: foo(make_unique(), make_unique()); Если какая-либо динамическая аллокация бросит исключение, то теперь умный указатель освободит ресурс.
13:40 с незапамятных времён в C (под winavr) писал битовые маски через 0b и даже не задумывался, что это, оказывается, расширение языка. Но ещё бОльшим удивлением стало то, что в плюсах такая простая вещь появилась относительно недавно))
2014: мы выпустили новый стандарт: пользуйтесь, радуйтесь
Спустя 6 лет:
P.S. Немного обидно за авторов нововведений
22:54 другие компиляторы в итоге научились?
Отличная лекция. Можете залить, пожалуйста, презентацию на гугл или яндекс диск? Нету странички в ВК, не могу скачать.
Теперь удалось скачать. Спасибо большое. 😃👍
@@KIR_Engineer Обратите внимание, что тут с 85 слайда начинается вторая лекция :) vk.com/doc-163428578_519103873
@@PVSStudioTool Понял. Спасибо. Иногда возникает желание освежить в памяти стандарты и лекцию. Спасибо за Ваш труд 😃👍
32:30 std::get(t) не передан параметр t
Да, пропустили этот момент на слайде. Спасибо что увидели и написали об этом)
make_shared понятно алокация для счётчика ссылок,
а make_unique а что алоцируется в unique?
make_unique динамически аллоцирует объект типа T, идеально передавая список параметров в конструктор T, и сразу оборачивает указатель в std::unique_ptr. Польза заключается в следующих вещах:
1) теперь можно забыть об использовании new-delete в свежем коде. make_unique не требует написания new, а умный указатель освободит ресурсы, вызвав delete (или кастомный deleter).
2) make_unique безопасен для создания временных умных указателей в случае бросания исключений. Рассмотрим следующий код:
foo(unique_ptr(new T()), unique_ptr(new U()));
Порядок вычисления аргументов в С++ является неуточненным поведением (unspecified behavior). Порядок может быть таким: new T -> unique_ptr -> new U -> unique_ptr.
А может быть и таким: new T -> new U -> unique_ptr -> unique_ptr. Во втором случае, если при аллокации U будет брошено исключение, то остается неосвобожденный ресурс T. make_uniqueрешает эту проблему:
foo(make_unique(), make_unique());
Если какая-либо динамическая аллокация бросит исключение, то теперь умный указатель освободит ресурс.
Главная задача этих функций не оптимизация аллокаций памяти, а возможность сделать создание умных указателей безопаснее с точки зрения исключений.