Описание тега return-value-optimization

C++ copy-elision of return-values.
1 ответ

Конструктор копирования не вызывается при возврате из перегруженного оператора + в перегруженный оператор =

Рассмотрим следующий код: #include <iostream> using namespace std; class loc { int longitude, latitude; public: loc() {} loc(int lg, int lt) { longitude = lg; latitude = lt; } loc(const loc& l) { cout << "a" << endl; } loc oper…
1 ответ

Как правильно вернуть большие данные из std::future в C++11

Я немного озадачен тем, как правильно возвращать большие данные из асинхронной функции в C++. Возьмите для примера этот код. Он создает большой вектор в функции и возвращает выделенный вектор. #include <unistd.h> #include <iostream> #inc…
24 июл '15 в 14:54
9 ответов

C++: возвращение по ссылке и копирование конструкторов

Ссылки на C++ сбивают меня с толку.:) Основная идея заключается в том, что я пытаюсь вернуть объект из функции. Я хотел бы сделать это без возврата указателя (потому что тогда мне придется вручную delete это), и без вызова конструктора копирования, …
4 ответа

Работает ли RVO на членах объекта?

Учтите следующее: struct A { /* ... */ }; A foo() { auto p = std::make_pair(A{}, 2); // ... do something return p.first; } auto a = foo(); Будет p.first копироваться, перемещаться или RVO-ed?
4 ответа

Должен ли я присвоить ссылку или копию функции, возвращающей значение?

У нас есть несколько функций, возвращающих значение: Foo function_1(){ Foo f; // ... return f; } Bar function_2(){ Bar b; // ... return b; } Baz function_3(){ Baz b; // ... return b; } Я использую их для создания экземпляров локальных переменных: vo…
2 ответа

Возврат локального объекта примитивного типа и структуры

Получение ссылки на временную переменную: struct S { S() = default; S(const S& other) = delete; S(S&& other) = delete; ~S(){} }; S foo1() { return {}; // RVO (???) } int foo2() { return 42; // RVO } int main() { S& i = foo1(); // com…
27 янв '16 в 14:43
0 ответов

Когда лучше возвращаться по ссылкам?

Вопрос Прочитав тонны статей о ссылках на rvalue, я узнал, что: std::string&& f_wrong() { std::string s("hello"); return std::move(s); } неправильно и: std::string f_right() { std::string s("hello"); return s; } достаточно для конструктора …
4 ответа

NRV (именованное возвращаемое значение) конструктор копирования

Недавно я читал "внутри объектной модели C++" и во время чтения главы 5 у меня возник следующий вопрос: Будет ли компилятор обрабатывать NRVO, даже если у класса есть конструктор копирования?
4 ответа

Что такое оптимизация копирования и возвращаемое значение?

Что такое копирование? Что такое (именованная) оптимизация возвращаемого значения? Что они подразумевают? В каких ситуациях они могут возникнуть? Каковы ограничения? Если вы получили ссылку на этот вопрос, вы, вероятно, ищете введение . Технический …
4 ответа

Константная ссылка на временное и копирование - C++

Пожалуйста, рассмотрите следующий код, struct foo { foo() { std::cout << "Constructing!" << std::endl; } foo(const foo& f) { std::cout << "Copy constructing!" << std::endl; } ~foo() { std::cout << "Destructing.." &l…
05 мар '10 в 04:50
1 ответ

Код, который кажется неправильным при компиляции (о возврате объекта)

Недавно кто-то задал мне вопрос о построении возвращаемого значения функции. После нескольких дискуссий я обнаружил, что что-то не так. Вот образец: #include <conio.h> #include <stdio.h> #include <iostream> /* struct A // Won't be …
13 июн '14 в 14:39
2 ответа

Когда компилятор выполняет RVO?

Кажется, есть много вопросов о том, когда компилятор будет выполнять RVO или почему он не выполняет его в такой-то ситуации. После прочтения http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/ я не могу обернуться вокруг этого. В основном …
11 апр '13 в 14:13
3 ответа

Может копировать elision/RVO, вызывать копирование / перемещение с одного и того же объекта

Допустим, у меня есть функция, которая выглядит так: SomeObject copy_maybe(bool make_new, const SomeObject& def) { if (make_new) return SomeObject(); else return def; } И я называю это так: SomeObject obj; obj = copy_maybe(true, obj); Без разреш…
11 апр '18 в 17:49
4 ответа

C++11 Оптимизация возвращаемого значения или переезд?

Я не понимаю, когда я должен использовать std::move и когда я должен позволить компилятору оптимизировать... например: using SerialBuffer = vector< unsigned char >; // let compiler optimize it SerialBuffer read( size_t size ) const { SerialBuf…
04 июл '13 в 15:19
0 ответов

Как быть уверенным в оптимизации копирования / возврата

Я часто возвращаю объекты по значению, предполагая, что копия elision / RVO произойдет. Но я не очень хорошо разбираюсь в компиляторах, и возможность, что иногда что-то в моем коде может саботировать копирование без моего ведома, пугает меня. Нужно …
20 ноя '15 в 13:15
1 ответ

Почему требования RVO такие строгие?

Еще одно "почему должны std::move предотвратить (безымянный) возврат-оптимизацию?" Почему std::move предотвращает RVO? объясняет, что стандарт специально требует, чтобы объявленный тип возвращаемого значения функции соответствовал типу выражения в r…
2 ответа

valueOf() в Java возвращает объект Но почему там нет хеш-кода?

API для Integer.valueOf("123") возвращает объект. Так что, если я пишу это System.out.println(Integer.valueOf("456"));или же System.out.println(String.valueOf(256)); это должно дать мне хэш-код объекта, но вместо этого он печатает простые значения 4…
18 фев '15 в 11:18
7 ответов

В C++ все еще плохая практика возвращать вектор из функции?

Короткая версия: во многих языках программирования принято возвращать большие объекты, такие как векторы / массивы. Является ли этот стиль приемлемым в C++0x, если у класса есть конструктор перемещения, или программисты C++ считают его странным / ур…
3 ответа

Правильный способ (переместить семантику) для возврата std::vector из вызова функции в C++11

Я хочу заполнить std::vector (или какой-нибудь другой контейнер STL): class Foo { public: Foo(int _n, const Bar &_m); private: std::vector<Foo> fooes_; } 1. Хорошо выглядящий ctor, высокая производительность std::vector<Foo> get_vect…
2 ответа

Оптимизация компилятора возвращаемого значения в VS 2010

Используя VS 2010 с полной оптимизацией /Ox рассмотрим следующие два вызова функций: static string test1(const string& input) { return input; } static void test2(const string& input, string& output) { output = input; } Если я использую п…