Вопросы по теме 'copy-elision'

прохождение тяжелых объектов C++0x
У меня есть функция, которая создает тип дорогого объекта (содержащего векторы и карты нефиксированного размера), поэтому я действительно хочу избежать вызова копирования c'tors. До сих пор я только что возвращал std::shared_ptr из метода и...
488 просмотров
schedule 30.07.2022

Передача по значению и оптимизация исключения копирования
Я наткнулся на статью http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/ Совет автора: Не копируйте аргументы вашей функции. Вместо этого передайте их по значению и позвольте компилятору сделать копирование. Однако я не...
1745 просмотров
schedule 07.06.2023

Конструктор копирования не вызывается при инициализации объекта с возвращаемым значением функции
Рассмотрим следующий код: #include <iostream> using namespace std; class A { public: int a; A(): a(5) { cout << "Constructor\n"; } A(const A &b) { a =...
782 просмотров

Как избежать перемещения при передаче временного значения по значению?
В следующем коде: Widget makeWidget() { return Widget(); } void foo(Widget widget) { ... } foo(makeWidget()); объект Widget всегда будет создаваться на месте (внутри функции foo), поэтому не происходит построения перемещения (по...
441 просмотров
schedule 10.11.2022

Move Constructor vs Copy Elision. Какой из них вызывается?
У меня есть два фрагмента кода, чтобы показать вам. Это два класса, каждый из которых предоставляет конструктор перемещения и функцию, которая возвращает временное значение. В первом случае функция, возвращающая временное значение, вызывает...
3111 просмотров

Как работает гарантированное копирование?
На встрече по стандартам ISO C ++ в Оулу в 2016 г. было внесено предложение под названием Гарантированное копирование с помощью упрощенных категорий значений было одобрено комитетом по стандартам C ++ 17. Как именно работает гарантированное...
13567 просмотров
schedule 07.12.2023

Запрещает ли C ++ 17 исключение копирования в случае, если это разрешено в C ++ 14?
Учтите следующее: struct X { X() {} X(X&&) { puts("move"); } }; X x = X(); В C ++ 14 перемещение можно было опустить, несмотря на то, что конструктор перемещения имеет побочные эффекты благодаря [class.copy] / 31, Это...
479 просмотров
schedule 09.07.2022

Зависит ли поведение гарантированного исключения копирования от существования определяемого пользователем конструктора копирования?
Следующий код ведет себя по-разному с пользовательским конструктором копирования или без него в GCC 8.0.1 : #include <cassert> struct S { int i; int *p; S() : i(0), p(&i) {} // S(const S &s) : i(s.i), p(&i) {}...
801 просмотров
schedule 30.03.2022

Исключение копирования/перемещения требует явного определения конструкторов копирования/перемещения.
Рассмотрим следующую программу: #include <iostream> #include <utility> class T { public: T() { printf("address at construction: %zx\n", (uintptr_t)this); } // T(const T&) { printf("copy-constructed\n"); } // helps...
252 просмотров

Const-корректность для нетривиальных переменных
(отчасти вдохновленный этим ответом , хотя и не связанным) Мне всегда говорили (и я говорил), что сохранение const -правильности даже для недолговечных переменных является ценным и хорошей практикой, например: const std::string a = "Hello...
178 просмотров
schedule 20.09.2022

Требуется ли конструктор/назначение перемещения для запуска RVO в С++ 11?
Например: В принятом ответе https://stackoverflow.com/a/14623480/1423254 Будет ли копирование elision и RVO по-прежнему работать для классов без конструкторов перемещения? Да, RVO все еще срабатывает. На самом деле ожидается, что компилятор...
95 просмотров
schedule 20.09.2023

Предотвращение ненужного копирования между большими структурами
У меня есть огромные структуры DataFrom и Data (которые на самом деле имеют разные члены). Данные создаются из DataFrom. struct DataFrom{ int a = 1; int b = 2; }; static DataFrom dataFrom; struct Data{ int a; int b; }; class...
100 просмотров
schedule 07.11.2022

MSVC не может вернуть объект, который можно скопировать, но нельзя переместить
Когда я возился с copy elision, я столкнулся со странным поведением: class Obj { public: Obj() = default; Obj(Obj&&) = delete; Obj(const Obj&) { std::cout << "Copy" << std::endl; } }; Obj f1() { Obj o;...
901 просмотров