Как новичок в C ++, который только поверхностно изучал объектно-ориентированное программирование, я был знаком только с правилом трех: не забудьте явно определить конструктор копирования, оператор присваивания копии и деструктор, если я переопределю любое из их (обычно для управления ресурсами). Однако с появлением семантики перемещения в C ++ 11 правило трех было расширено до правила пяти, добавляя оператор присваивания перемещения и конструктор перемещения к количеству кода, который мне нужно выполнить. Что они могут предложить помимо накопления моего кода?
Move Semantics - дружеское введение
Философия семантики ходов должна быть основана на том, что «мусор для одного человека - сокровище для другого» (шучу!). Семантика перемещения позволяет программистам повторно использовать объекты, срок жизни которых близок к концу, путем замены адресов ресурсов каждого объекта, что позволяет избежать затрат на глубокое копирование ресурсов.
И конструктор перемещения, и оператор присваивания перемещения получают в качестве параметра ссылку на rvalue. Вкратце, ссылка rvalue идентифицирует то, что не имеет адреса в памяти, например значение в правой части выражения присваивания или любой объект, который вот-вот будет уничтожен в памяти, например временный объект или объект, срок существования которого истекает.
Семантика контрольного перемещения в C ++
Чтобы действительно доказать его производительность, я написал модуль TimedEvents
, который определяет, сколько времени требуется каждой специальной функции-члену класса для выполнения задачи.
Я также написал другой класс, RecordSet
, для оценки времени выполнения 5 специальных функций-членов этого класса. Задача, возложенная на них, проста: прочитать текстовый файл и загрузить каждое слово в нем в один из его элементов данных, m_records
. Экземпляр класса RecordSet
успешно завершает задачу только после того, как он загрузил все слова текстового файла в динамически выделяемый строковый массив m_records
.
Затем мне просто нужно было написать программу для тестирования этих специальных функций-членов.
Вот результат, который я получил от запуска программы:
Без сомнения, введение семантики перемещения может быть небольшим шагом в развитии C ++, но это гигантский скачок в производительности управления памятью.