HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: c++, конструктор перемещения</p>
1 <p>Теги: c++, конструктор перемещения</p>
2 <p>Move-семантика даёт возможность перемещать объект, а не копировать его, что увеличивает производительность. Давайте посмотрим, как работает семантика на примере, в котором будем использовать класс String:</p>
2 <p>Move-семантика даёт возможность перемещать объект, а не копировать его, что увеличивает производительность. Давайте посмотрим, как работает семантика на примере, в котором будем использовать класс String:</p>
3 <p>Обратите внимание, что во время передачи объекта этого класса в функцию, которая принимает его по значению (давайте назовём её by_value()) произойдёт вот что:</p>
3 <p>Обратите внимание, что во время передачи объекта этого класса в функцию, которая принимает его по значению (давайте назовём её by_value()) произойдёт вот что:</p>
4 <p>То есть мы видим четыре обращения к аллокатору, а это довольно накладно. Однако если объект String нам более не понадобится, при этом функцию by_value() изменять нельзя, мы можем переместить объект, не копируя его. Чтобы это осуществить, надо написать для класса String конструктор перемещения:</p>
4 <p>То есть мы видим четыре обращения к аллокатору, а это довольно накладно. Однако если объект String нам более не понадобится, при этом функцию by_value() изменять нельзя, мы можем переместить объект, не копируя его. Чтобы это осуществить, надо написать для класса String конструктор перемещения:</p>
5 <p>Итак, во-первых, параметр конструктора перемещения other является неконстантным, так как конструктор его меняет. Во-вторых, параметр является не lvalue-ссылкой (&amp;), а rvalue-ссылкой (&amp;&amp;). При этом сам конструктор переносит Си-строку с other на this, то есть делает other пустым.</p>
5 <p>Итак, во-первых, параметр конструктора перемещения other является неконстантным, так как конструктор его меняет. Во-вторых, параметр является не lvalue-ссылкой (&amp;), а rvalue-ссылкой (&amp;&amp;). При этом сам конструктор переносит Си-строку с other на this, то есть делает other пустым.</p>
6 <p>В общем случае конструктор перемещения не медленнее, а часто быстрее конструктора копирования, однако ничего не мешает разработчику поместить в конструктор перемещения<em>sleep(10'000)</em>.</p>
6 <p>В общем случае конструктор перемещения не медленнее, а часто быстрее конструктора копирования, однако ничего не мешает разработчику поместить в конструктор перемещения<em>sleep(10'000)</em>.</p>
7 <p>Чтобы вызвать конструктор перемещения, а не конструктор копирования, вы можете задействовать std::move(). В результате наш пример станет выглядеть так:</p>
7 <p>Чтобы вызвать конструктор перемещения, а не конструктор копирования, вы можете задействовать std::move(). В результате наш пример станет выглядеть так:</p>
8 auto string = String("Hello, C++11"); by_value(std::move(string)); // перемещение string в by_value(), string теперь пустая stdout: String(const char *const c_string) // new[] String(String&amp;&amp; other) // за счёт замены на конструктор перемещения, пропал new[] ~String() // delete[] ~String() // delete[] на nullptr<p>Итог использования move-семантики следующий:<strong>число обращений к аллокатору уменьшилось в два раза</strong>!</p>
8 auto string = String("Hello, C++11"); by_value(std::move(string)); // перемещение string в by_value(), string теперь пустая stdout: String(const char *const c_string) // new[] String(String&amp;&amp; other) // за счёт замены на конструктор перемещения, пропал new[] ~String() // delete[] ~String() // delete[] на nullptr<p>Итог использования move-семантики следующий:<strong>число обращений к аллокатору уменьшилось в два раза</strong>!</p>
9 <p><em><a>Источник</a></em></p>
9 <p><em><a>Источник</a></em></p>
10  
10