Move семантика

Семантика перемещения появилась с выходом стандарта C++11, чтобы дополнить RVO в C++98; Её также можно считать оптимизацией на подобии RVO, которую определяет пользователь (создавая конструкторы перемещения и перемещающий оператор копирования).

Хотя изначально она была создана для оптимизации, её так же можно использовать для некоторых ограничений. Например у std::unique_ptr нет конструктора копирования, зато есть перемещающий конструктор, благодаря чему обеспечивается единоличное владение (подробнее о std::unique_ptr здесь).

Читать далее

Copy elision (RVO & NRVO)

Оптимизация возвращаемого значений (RVO), оптимизация именованного возвращаемого значения (NRVO) и Copy-Elision появились в C++ начиная с C++98. Ниже я объясню, что означают эти концепции и как они помогают улучшить производительность во время выполнения.

Читать далее

Введение в smart_ptr

Указатели в C и C++ дикие звери. Они чрезвычайно мощные, но в то же время такие опасные: небольшой недосмотр может нанести ущерб всему вашему приложению. Их основная проблема заключается в том, что вы и только вы должны следить за корректной работой с ними. Каждый динамически созданный объект (т.е. new T) должен сопровождаться ручным удалением (т.е. delete T). Забудьте об этом, и у вас получится хорошая утечка памяти.

Кроме того, динамически выделенные массивы (т.е. new T[N]) должны быть удалены с помощью другого оператора (т.е. delete[]). Это заставляет вас мысленно следить за тем, что вы выделили, и вызывать соответствующий оператор. Использование неправильного оператора приводит к неопределенному поведению, что ни в коем случае нельзя допускать при работе в C++.

Читать далее

Частичная специализация шаблона

Надоело перегружать функцию для каждого типа? Хватит это терпеть!

Сегодня мы рассмотрим как создать одну шаблонную функцию, которая будет ‘включенной’ для заданных типов и ‘выключенной’ для остальных.

Читать далее