Добавить в корзинуПозвонить
Найти в Дзене

Сделайте «снимок» кода С++, посмотрим что у вас!

Материал подготовлен для студентов курса «Разработчик C++» в образовательном проекте OTUS. Современный C++ породил странный страх сделать что-то недостаточно эффективно. По этой причине в коде часто можно встретить std::move совершенно не к месту. Или какие-то сложные телодвижения, нацеленные на избавление от копирования возвращаемого значения. Иногда кажется, что это для многих стало чем-то вроде фобии. А-а-а-а, я тут лишнего скопировал! И пропал на час, придумывая как избавиться от него. Это действительно увлекательный процесс и сложно себе отказать в том, чтобы сделать мир код лучше. Однако такого рода деятельность требует глубокого понимания стандарта и даже работы кодогенератора. К счастью, в этом случае мы можем себе позволить упростить себе немного жизнь. Причём для этого можно воспользоваться техникой, схожей с приёмом контрастного раствора при создании рентгеновского снимка. Начнём? Сначала введём себя в состояние страха, что в примере ниже является избыточным количеством
Оглавление
Материал подготовлен для студентов курса «Разработчик C++» в образовательном проекте OTUS.

Современный C++ породил странный страх сделать что-то недостаточно эффективно. По этой причине в коде часто можно встретить std::move совершенно не к месту. Или какие-то сложные телодвижения, нацеленные на избавление от копирования возвращаемого значения.

Иногда кажется, что это для многих стало чем-то вроде фобии. А-а-а-а, я тут лишнего скопировал! И пропал на час, придумывая как избавиться от него.

Это действительно увлекательный процесс и сложно себе отказать в том, чтобы сделать мир код лучше. Однако такого рода деятельность требует глубокого понимания стандарта и даже работы кодогенератора.

К счастью, в этом случае мы можем себе позволить упростить себе немного жизнь. Причём для этого можно воспользоваться техникой, схожей с приёмом контрастного раствора при создании рентгеновского снимка.

Начнём?

Сначала введём себя в состояние страха, что в примере ниже является избыточным количеством копирований.

#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 = foo(argc % 2);

return 0;
}

Трясёмся мы над количеством копирований и способами их минимизации при прохождении объекта с момента его конструировании строками "42" и "24" до попадания в переменную target.

А теперь приготовим наше зелье, наш контраст

#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;
}
};

Для того, чтобы запустить его в организм нашего кода нам достаточно заменить тип std::string на xray и посмотреть, что получится. При необходимости мы можем дополнить наш контраст необходимыми для компиляции методами. Мы можем делать что хотим, в конце концов мы пытаемся увидеть то, что скрыто.

Что собой представляет наш контраст, видно из кода. Основная его цель — трассировка тех методов, которые вызываются по инициативе компилятора, а не разработчика. Прежде всего это конструкторы, деструкторы и различного рода операторы.

ННу и в конце, посмотрим что же у нас получилось?

ctor
op =
dtor

Можем спокойно выдохнуть и продолжить работу, зная что никаких лишних копирований мы не совершили.

Есть вопрос? Напишите в комментариях!

Дмитрий Шебордаев, руководитель отдела разработки технологий в Rambler&Co и преподаватель курса «Разработчик C++» в OTUS
Дмитрий Шебордаев, руководитель отдела разработки технологий в Rambler&Co и преподаватель курса «Разработчик C++» в OTUS
Материал подготовлен для студентов курса «Разработчик C++» в образовательном проекте OTUS. Чтобы присоединиться к ближайшей группе, обязательно пройдите вступительное тестирование:
ПРОЙТИ ТЕСТИРОВАНИЕ