Копирование-исключение возвращаемых значений в C++
1 ответ

Поможет ли std::move() при построении объекта в операторе return или предотвратит RVO?

Из-за широкого спектра ответов от сообщества, я спрашиваю об этом в надежде разоблачить специфичные для реализации ответы от пользователей переполнения стека. Какой из них является наилучшим (предлагает наибольшую оптимизацию)? // version 1 MyObject…
27 июл '17 в 00:07
2 ответа

Как я могу избежать выходных параметров при выполнении возврата?

Как мы знаем, что выходные параметры действительно плохо void foo(set<int> *x) Здесь x - это ожидаемые параметры, это довольно распространенная практика в системных вызовах Linux. Но для C++ это не очень хорошая практика кодирования. У меня ес…
22 авг '13 в 19:51
1 ответ

Гарантирует ли C++11, что локальная переменная в операторе возврата будет перемещена, а не скопирована?

#include <vector> using namespace std; struct A { A(const vector<int>&) {} A(vector<int>&&) {} }; A f() { vector<int> coll; return A{ coll }; // Which constructor of A will be called as per C++11? } int main() { f…
24 фев '17 в 16:22
4 ответа

Как возможно перемещение возвращаемого const объекта?

В последнее время я читал этот пост и этот пост, предлагая прекратить возвращать const объекты. Это предложение также дает Стефан Т. Лававей в своем выступлении в Going Native 2013. Я написал очень простой тест, чтобы помочь мне понять, какой констр…
12 дек '13 в 13:35
1 ответ

C++ RVO: когда это произойдет?

http://coliru.stacked-crooked.com/a/c795a5d2bb91ae32 #include <iostream> struct X { X(const char *) { std::cout << 1; } X(const X &) { std::cout << 2; } X(X &&) { std::cout << 3; } }; X f(X a) { return a; } X g(c…
13 мар '17 в 19:17
1 ответ

Как лучше использовать код ошибки в C++?

Я участник проекта, который использует C++11. Я не уверен, когда я должен использовать код ошибки для возвращаемых значений. Я обнаружил, что RVO в C++ прекрасно работает, даже если данные строки и структуры возвращаются напрямую. Но если я использу…
18 авг '15 в 02:17
4 ответа

Указатели на размещенный в стеке объект и перемещение-конструирование

Примечание. Это полная переформулировка вопроса, который я недавно опубликовал. Если вы обнаружите, что они повторяются, закройте другой. Моя проблема довольно общая, но, кажется, ее легче объяснить на конкретном простом примере. Итак, представьте, …
02 апр '15 в 16:44
0 ответов

VS2017: конструктор копирования не работает при удалении конструктора перемещения

Рассмотрим следующий фрагмент кода: #include <iostream> using namespace std; struct Snitch { Snitch() { cout << "c'tor" << endl; } ~Snitch() { cout << "d'tor" << endl; } Snitch(const Snitch&) { cout << "copy c…
28 фев '19 в 11:27
2 ответа

Почему RVO не происходит для оператора присваивания? (C++)

Пример: A myfunction() { return A(); } A a = myfunction(); // default ctor only (return value optimization) a = myfunction(); // default ctor and operator= Почему компилятор не может просто записать новый объект в существующий объект? Я считаю, что …
27 ноя '13 в 18:14
2 ответа

Возвращая карту с помощью getter в проблемах производительности C++

У меня есть класс, который имеет 3-4 члена данных типа std::map<string, vector<string>> который используется для кэширования данных. Его экземпляр создается один раз, а данные заполняются на всех картах из сервисного вызова. У меня есть …
20 фев '18 в 22:05
3 ответа

Произойдет ли RVO при возврате std::pair?

Функция должна вернуть вызывающей стороне два значения. Каков наилучший способ реализации? Опция 1: pair<U,V> myfunc() { ... return make_pair(getU(),getV()); } pair<U,V> mypair = myfunc(); Вариант 1.1: // Same defn U u; V v; tie(u,v) = m…
26 дек '12 в 16:55
1 ответ

Почему общедоступный конструктор копирования требуется при назначении временного возвращаемого объекта для ссылки?

Рассмотрим следующий код: class MyClass { MyClass() { x = 0; } MyClass(const MyClass&) { x = 1; } public: int x; MyClass(MyClass&&) { x = 2; } static const MyClass f() { return MyClass(); } }; int main() { const MyClass& p = MyClass:…
11 дек '14 в 18:20
1 ответ

Операторы RVO с несколькими возвратами

Мы работаем с RVO в классе, чтобы показать, как мы можем уменьшить количество созданных временных. Я понял основы этого, но мне трудно понять, как объединить несколько значений для возврата в одну строку. Для одноразовой оптимизации я смог понять эт…
30 окт '14 в 22:57
1 ответ

C++ универсальная ссылка в конструкторе и оптимизации возвращаемого значения (rvo)

Почему оптимизация rvalue не происходит в классах с конструктором с универсальными ссылочными аргументами? http://coliru.stacked-crooked.com/a/672f10c129fe29a0 #include <iostream> template<class ...ArgsIn> struct C { template<class ..…
1 ответ

Оптимизация возвращаемого значения с помощью std::pair

В настоящее время я весьма озадачен гарантированным RVO в C++17 и его последствиями. Я понимаю, что для NRVO, я должен убедиться, что вернуть один и тот же экземпляр объекта через все возможные пути возврата функции и инициализировать связанный объе…
10 окт '18 в 19:50
1 ответ

Почему Visual Studio не выполняет оптимизацию возвращаемого значения (RVO) в этом случае

Я отвечал на вопрос и рекомендовал возврат по значению для большого типа, потому что был уверен, что компилятор выполнит оптимизацию возвращаемого значения (RVO). Но потом мне сказали, что Visual Studio 2013 не выполняет RVO для моего кода. Я нашел …
21 сен '14 в 20:45
1 ответ

C++11 кортеж с копией elision или переместить семантику

Я написал функцию, как показано ниже: template <typename T> std::tuple<std::vector<T>, T, T> f() { std::vector<T> p(1000); return std::make_tuple(std::move(p), 10, 10); } Поскольку возвращаемый тип довольно сложен, гарантируе…
26 июн '15 в 15:45
2 ответа

Стандарт C++: возврат по копии для инициализации ссылки без RVO: есть ли копия?

Давайте рассмотрим следующий пример: struct big_type {}; // Return by copy auto factory() { return big_type{}; } void any_scope_or_function() { big_type&& lifetime_extended = factory(); } По предположению, RVO запрещено или не присутствует в…
27 июн '17 в 19:07
1 ответ

Вводит ли новая переменная поражение при оптимизации возвращаемого значения?

Мы все это знаем Foo returnAFoo() { return Foo(); } будет скомпилирован с оптимизацией возвращаемого значения, поэтому копия значения не будет взята, даже если конструктор копирования Foo имеет побочные эффекты. Но будет Foo returnAFoo() { Foo f = F…
23 мар '16 в 08:41
1 ответ

Когда на самом деле вызывается конструктор перемещения, если у нас есть (N)RVO?

Я понял из нескольких вопросов здесь о SO, что (N)RVO предотвращает вызов конструктора перемещения, когда объект возвращается по значению. Классический пример: struct Foo { Foo() { std::cout << "Constructed\n"; } Foo(const Foo &) { std::co…
24 апр '18 в 17:16