C++ копирование именованных (следовательно, не временных) возвращаемых значений
4 ответа

Почему следует полагаться на оптимизацию именованных возвращаемых значений?

Я читал о NRVO и пытался понять, когда следует полагаться на него, а когда нет. Теперь у меня вопрос: зачем вообще полагаться на NRVO? Всегда можно явно передать возвращаемый параметр по ссылке, поэтому есть ли причина полагаться на NRVO?
14 авг '13 в 16:47
2 ответа

Какая структура функций лучше?

Посмотрите на следующий код: class MyClass{ public: MyClass(){} MyClass(MyClass &&){} MyClass(const MyClass &){} }; MyClass f1(){ MyClass &&o=MyClass(); /*...*/ return std::move(o);//or return static_cast<MyClass &&&gt…
26 окт '11 в 03:20
1 ответ

Избегать const местных жителей, которые возвращаются?

Я всегда думал, что хорошо иметь постоянных местных жителей. void f() { const resource_ptr p = get(); // ... } Однако на прошлой неделе я наблюдал за студентами, которые работали над упражнением C++ и интересовались возвращаемым указателем const res…
04 июл '16 в 20:32
2 ответа

Почему Clang не оптимизирует это с NRVO?

Я пытаюсь понять, почему достаточно хороший компилятор C++ 11 (clang) не оптимизирует этот код, и мне интересно, есть ли у кого-нибудь здесь мнения. #include <iostream> #define SLOW struct A { A() {} ~A() { std::cout << "A d'tor\n"; } A(…
18 дек '13 в 04:58
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
2 ответа

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

Предположим, у меня есть такая функция: using std::vector; vector<int> build_vector(int n) { if (some_condition(n)) return {}; vector<int> out; for(int x : something()) { out.push_back(x); } return out; } Ли return {} в начале функции пр…
17 дек '18 в 21:26
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
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
4 ответа

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

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

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

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

Не удается вернуть элемент unique_ptr из массива по значению

Следующее компилируется и работает как положено: std::unique_ptr<char> input_to_char_array() { std::unique_ptr<char> c; c.reset(new char('b')); // c[1].reset(new char[20]()); return c; } Но это не так: std::unique_ptr<char> input_t…
14 июл '15 в 06:09
2 ответа

C++ - NRVO и переезд

Я прочитал несколько постов о функциях перемещения (например, http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html) и хотел наблюдать за ходом операторов в действии. Поэтому я попробовал следующий код: #include <ve…
06 июн '17 в 09:00
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
1 ответ

Являются ли компиляторы достаточно умными для того, чтобы переменные std::move выходили из области видимости?

Рассмотрим следующий фрагмент кода: std::vector<int> Foo() { std::vector<int> v = Bar(); return v; } return v равно O(1), так как NRVO пропустит копию, конструируя v непосредственно в хранилище, куда возвращаемое значение функции в проти…
16 июн '18 в 00:24
0 ответов

Как вернуть строку по значению C++ с семантикой перемещения?

Я хочу иметь функцию, которая возвращает строку по значению, и я хочу переместить построить другую строку из этого возвращаемого значения. Когда вызывается NRVO/RVO, конструктор перемещения работает нормально, копия не создается, но когда я не могу …
16 фев '14 в 16:43
1 ответ

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

Я новичок в C++, и я немного читал об оптимизации возвращаемых значений на вики и на этом веб-сайте, однако мне все еще интересно, как происходит следующее поведение: using namespace std; class A { public: A() {cout << "A Ctor" << endl;}…
09 сен '13 в 20:24
1 ответ

C++: я должен явно использовать std::move() в операторе возврата для принудительного перемещения?

РЕДАКТИРОВАТЬ: это не дубликат, потому что этот вопрос спрашивает о решении компилятора в O0. Здесь сказано, что Оптимизация возвращаемого значения имени (NRVO) - это поддержка многих компиляторов. Но это необходимость или просто приятная оптимизаци…
14 авг '17 в 18:37
0 ответов

При каких условиях современные компиляторы C++ не выполняют rvo?

Из соображений производительности я заинтересован в том, чтобы убедиться, что RVO выполняется для возвращаемых значений функций. Что может помешать выполнению этой оптимизации современным компилятором C++ (таким как gcc, clang и msvc 2015), о которо…
18 июн '16 в 22:34
3 ответа

Как заставить оптимизацию возвращаемого значения в msvc

У меня есть функция в классе, которую я хочу, чтобы компилятор использовал NRVO... все время... даже в режиме отладки. Есть ли для этого прагма? Вот мой класс, который отлично работает в режиме "релиз": template <int _cbStack> class CBuffer { …
10 янв '13 в 23:37