HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: c++, операторы, cplus, конструкторы, деструкторы, std::move, target, xray, std::string, копирования</p>
1 <p>Теги: c++, операторы, cplus, конструкторы, деструкторы, std::move, target, xray, std::string, копирования</p>
2 <p>Современный C++ породил странный страх сделать что-то недостаточно эффективно. По этой причине в коде часто можно встретить std::move совершенно не к месту. Или какие-то сложные телодвижения, нацеленные на избавление от копирования возвращаемого значения.</p>
2 <p>Современный C++ породил странный страх сделать что-то недостаточно эффективно. По этой причине в коде часто можно встретить std::move совершенно не к месту. Или какие-то сложные телодвижения, нацеленные на избавление от копирования возвращаемого значения.</p>
3 <p>Иногда кажется, что это для многих стало чем-то вроде фобии. А-а-а-а, я тут лишнего скопировал! И пропал на час, придумывая как избавиться от него.</p>
3 <p>Иногда кажется, что это для многих стало чем-то вроде фобии. А-а-а-а, я тут лишнего скопировал! И пропал на час, придумывая как избавиться от него.</p>
4 <p>Это действительно увлекательный процесс и сложно себе отказать в том, чтобы сделать мир код лучше. Однако такого рода деятельность требует глубокого понимания стандарта и даже работы<em>кодогенератора</em>.</p>
4 <p>Это действительно увлекательный процесс и сложно себе отказать в том, чтобы сделать мир код лучше. Однако такого рода деятельность требует глубокого понимания стандарта и даже работы<em>кодогенератора</em>.</p>
5 <p>К счастью, в этом случае мы можем себе позволить упростить себе немного жизнь. Причём для этого можно воспользоваться техникой, схожей с приёмом контрастного раствора при создании рентгеновского снимка.</p>
5 <p>К счастью, в этом случае мы можем себе позволить упростить себе немного жизнь. Причём для этого можно воспользоваться техникой, схожей с приёмом контрастного раствора при создании рентгеновского снимка.</p>
6 <h2>Начнём?</h2>
6 <h2>Начнём?</h2>
7 <p>Сначала введём себя в состояние страха, что в примере ниже является избыточным количеством копирований.</p>
7 <p>Сначала введём себя в состояние страха, что в примере ниже является избыточным количеством копирований.</p>
8 #include &lt;iostream&gt; #include &lt;string&gt; auto foo(bool b) { std::string x; if (b) x = "42"; else x = "24"; return x; } int main(int argc, char **argv) { auto bar = [](bool b) { if (b) return foo(b); else return foo(b); }; auto target = bar(argc % 2); return 0; }<p>Трясёмся мы над количеством копирований и способами их минимизации при прохождении объекта с момента его конструировании строками "42" и "24" до попадания в переменную target.</p>
8 #include &lt;iostream&gt; #include &lt;string&gt; auto foo(bool b) { std::string x; if (b) x = "42"; else x = "24"; return x; } int main(int argc, char **argv) { auto bar = [](bool b) { if (b) return foo(b); else return foo(b); }; auto target = bar(argc % 2); return 0; }<p>Трясёмся мы над количеством копирований и способами их минимизации при прохождении объекта с момента его конструировании строками "42" и "24" до попадания в переменную target.</p>
9 <h2>А теперь приготовим наше зелье, наш контраст</h2>
9 <h2>А теперь приготовим наше зелье, наш контраст</h2>
10 #include &lt;iostream&gt; struct xray { xray() { std::cout &lt;&lt; "ctor" &lt;&lt; std::endl; } xray(const xray &amp;) { std::cout &lt;&lt; "ctor copy" &lt;&lt; std::endl; } xray(xray &amp;&amp;) { std::cout &lt;&lt; "ctor move" &lt;&lt; std::endl; } ~xray() { std::cout &lt;&lt; "dtor" &lt;&lt; std::endl; } xray &amp; operator=(const std::string &amp;) { std::cout &lt;&lt; "op =" &lt;&lt; std::endl; return *this; } };<p>Для того, чтобы запустить его в организм нашего кода нам достаточно заменить тип std::string на xray и посмотреть, что получится. При необходимости мы можем дополнить наш<em>контраст</em>необходимыми для компиляции методами. Мы можем делать что хотим, в конце концов мы пытаемся увидеть то, что скрыто.</p>
10 #include &lt;iostream&gt; struct xray { xray() { std::cout &lt;&lt; "ctor" &lt;&lt; std::endl; } xray(const xray &amp;) { std::cout &lt;&lt; "ctor copy" &lt;&lt; std::endl; } xray(xray &amp;&amp;) { std::cout &lt;&lt; "ctor move" &lt;&lt; std::endl; } ~xray() { std::cout &lt;&lt; "dtor" &lt;&lt; std::endl; } xray &amp; operator=(const std::string &amp;) { std::cout &lt;&lt; "op =" &lt;&lt; std::endl; return *this; } };<p>Для того, чтобы запустить его в организм нашего кода нам достаточно заменить тип std::string на xray и посмотреть, что получится. При необходимости мы можем дополнить наш<em>контраст</em>необходимыми для компиляции методами. Мы можем делать что хотим, в конце концов мы пытаемся увидеть то, что скрыто.</p>
11 <p>Что собой представляет наш контраст, видно из кода. Основная его цель - трассировка тех методов, которые вызываются по инициативе компилятора, а не разработчика. Прежде всего это<strong>конструкторы</strong>,<strong>деструкторы</strong>и различного рода<strong>операторы</strong>.</p>
11 <p>Что собой представляет наш контраст, видно из кода. Основная его цель - трассировка тех методов, которые вызываются по инициативе компилятора, а не разработчика. Прежде всего это<strong>конструкторы</strong>,<strong>деструкторы</strong>и различного рода<strong>операторы</strong>.</p>
12 <h2>Ну и в конце, посмотрим что же у нас получилось?</h2>
12 <h2>Ну и в конце, посмотрим что же у нас получилось?</h2>
13 <p>Можем спокойно выдохнуть и продолжить работу, зная что никаких лишних копирований мы не совершили.</p>
13 <p>Можем спокойно выдохнуть и продолжить работу, зная что никаких лишних копирований мы не совершили.</p>
14 <p><em>Есть вопрос? Напишите в комментариях!</em></p>
14 <p><em>Есть вопрос? Напишите в комментариях!</em></p>
15  
15