Как новичок в C ++, который только поверхностно изучал объектно-ориентированное программирование, я был знаком только с правилом трех: не забудьте явно определить конструктор копирования, оператор присваивания копии и деструктор, если я переопределю любое из их (обычно для управления ресурсами). Однако с появлением семантики перемещения в C ++ 11 правило трех было расширено до правила пяти, добавляя оператор присваивания перемещения и конструктор перемещения к количеству кода, который мне нужно выполнить. Что они могут предложить помимо накопления моего кода?

Move Semantics - дружеское введение

Философия семантики ходов должна быть основана на том, что «мусор для одного человека - сокровище для другого» (шучу!). Семантика перемещения позволяет программистам повторно использовать объекты, срок жизни которых близок к концу, путем замены адресов ресурсов каждого объекта, что позволяет избежать затрат на глубокое копирование ресурсов.

И конструктор перемещения, и оператор присваивания перемещения получают в качестве параметра ссылку на rvalue. Вкратце, ссылка rvalue идентифицирует то, что не имеет адреса в памяти, например значение в правой части выражения присваивания или любой объект, который вот-вот будет уничтожен в памяти, например временный объект или объект, срок существования которого истекает.

Семантика контрольного перемещения в C ++

Чтобы действительно доказать его производительность, я написал модуль TimedEvents, который определяет, сколько времени требуется каждой специальной функции-члену класса для выполнения задачи.

Я также написал другой класс, RecordSet, для оценки времени выполнения 5 специальных функций-членов этого класса. Задача, возложенная на них, проста: прочитать текстовый файл и загрузить каждое слово в нем в один из его элементов данных, m_records. Экземпляр класса RecordSet успешно завершает задачу только после того, как он загрузил все слова текстового файла в динамически выделяемый строковый массив m_records.

Затем мне просто нужно было написать программу для тестирования этих специальных функций-членов.

Вот результат, который я получил от запуска программы:

Без сомнения, введение семантики перемещения может быть небольшим шагом в развитии C ++, но это гигантский скачок в производительности управления памятью.