Сделайте «снимок» кода С++, посмотрим что у вас!
Современный C++ породил странный страх сделать что-то недостаточно эффективно. По этой причине в коде часто можно встретить
Иногда кажется, что это для многих стало чем-то вроде фобии. А-а-а-а, я тут лишнего скопировал! И пропал на час, придумывая как избавиться от него.
Это действительно увлекательный процесс и сложно себе отказать в том, чтобы сделать мир код лучше. Однако такого рода деятельность требует глубокого понимания стандарта и даже работы кодогенератора.
К счастью, в этом случае мы можем себе позволить упростить себе немного жизнь. Причём для этого можно воспользоваться техникой, схожей с приёмом контрастного раствора при создании рентгеновского снимка.
Начнём?
Сначала введём себя в состояние страха, что в примере ниже является избыточным количеством копирований.
#include <iostream> #include <string> 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; }
Трясёмся мы над количеством копирований и способами их минимизации при прохождении объекта с момента его конструировании строками
А теперь приготовим наше зелье, наш контраст
#include <iostream> struct xray { xray() { std::cout << "ctor" << std::endl; } xray(const xray &) { std::cout << "ctor copy" << std::endl; } xray(xray &&) { std::cout << "ctor move" << std::endl; } ~xray() { std::cout << "dtor" << std::endl; } xray & operator=(const std::string &) { std::cout << "op =" << std::endl; return *this; } };
Для того, чтобы запустить его в организм нашего кода нам достаточно заменить тип
Что собой представляет наш контраст, видно из кода. Основная его цель — трассировка тех методов, которые вызываются по инициативе компилятора, а не разработчика. Прежде всего это конструкторы, деструкторы и различного рода операторы.
Ну и в конце, посмотрим что же у нас получилось?
ctor op = dtor
Можем спокойно выдохнуть и продолжить работу, зная что никаких лишних копирований мы не совершили.
Есть вопрос? Напишите в комментариях!