# 01 Лекция, передача параметров по значению, RVO, NRVO (03.09.2022) > [TOC] [Онлайн компилятор (показывает ассемблер)](https://godbolt.org/) ## Зачем? ```cpp #include <string> #include <vector> int main() { std::string hello = "Hello"; std::vector<std::string> v; v.push_back(hello); //тут есть копирование } ``` ```cpp #include <vector> int main() { std::vector<std::fstream*> v; v.push_back(new std::fstream("1.txt"));//небезопасная строчка, вызывается исключение } ``` --- ```cpp #include <vector> int main() { std::vector<std::shared_ptr<std::fstream>> v; v.push_back(std::make_shared<<std::fstream>()); //будет работать } ``` ## Где НЕ возникает копирование ```cpp #include <string> std::string g(); void f(std::string); int main() { f(g()); //здесь НЕТ копирования } ``` ## Общее Функции неявно передается указатель куда должен записаться результат выполнения функции, хранится до тех пор, пока не пригодится. ## RVO Return value optimization - при передачи r-value выражений копий не делается (обязательна с C++17) ```cpp struct mytype{}; int main() { mytype y; f(y); //y - lvalue, copy f(mytype()); // mytype() - r-value, no copy f(g()); // g() - r-value, no copy } ``` ## NRVO Named return value optimization - будет оптимизированна переменная которая возвращается (не обязательная) (В return можно не делать копию) [Подробнее](https://en.cppreference.com/w/cpp/language/copy_elision) Нельзя сделать NRVO когда есть выборность обьектов для `return`: ```cpp int a() { int a, b; if(rand()) { return a; //Здесь нет NRVO } else { return b; //Здесь нет NRVO } } ``` > GCC не всегда справляеться с NRVO (если убрать все в ещё одни `{}` то NRVO не будет) # Оглавление > [TOC]