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

Почему NRVO запускает / не запускает g ++ в приведенном ниже коде?
Я изучал NRVO и его поддержку на разных компиляторах и обнаружил странное поведение, которое довольно сбивает с толку. Пример кода: #include <iostream> using namespace std; class X { public: X() {...
965 просмотров
schedule 27.10.2021

Как включить элементы перемещения, исключающие копирование, для собственных векторов?
Поддержка move для Eigen был представлен в этом патче в 2011 году . Однако я не могу найти конструктор перемещения в заголовочном файле Matrix. Кроме того, на веб-странице Eigen все еще есть семантика перемещения, указанная как элемент "to do"...
1093 просмотров
schedule 09.11.2021

Является ли этот код четко определенным, независимо от того, есть ли копия?
Рассмотрим этот код: #include <iostream> struct Test { int x; int y; }; Test func(const Test& in) { Test out; out.x=in.y; out.y=in.x; return out; } int main() { Test test{1,2}; std::cout << "x: "...
424 просмотров
schedule 02.11.2021

Почему необходима семантика перемещения для исключения временных копий?
Итак, мое понимание семантики перемещения состоит в том, что они позволяют вам переопределять функции для использования с временными значениями (rvalues) и избегать потенциально дорогостоящих копий (путем перемещения состояния из безымянного...
1369 просмотров

Сколько временных объектов создается при сложении двух объектов без оптимизации возвращаемого значения?
Я решил задать этот вопрос после прочтения пунктов 20 и 22 книги Скотта Мейерса «Более эффективный C ++». Допустим, вы написали класс для представления рациональных чисел: class Rational { public: Rational(int numerator = 0, int...
160 просмотров

Что такое диагностика clang 'range-loop-analysis'?
Фон: Рассмотрим следующий пример : #include <iostream> #include <vector> int main() { std::vector<bool> vectorBool{false, true}; for(const auto &element : vectorBool) std::cout << std::boolalpha <<...
5137 просмотров

инициализация некопируемого члена (или другого объекта) на месте из фабричной функции
Класс должен иметь допустимый конструктор копирования или перемещения, чтобы любой из этих синтаксисов был допустимым: C x = factory(); C y( factory() ); C z{ factory() }; В C++03 было довольно часто полагаться на исключение копирования,...
2364 просмотров
schedule 01.03.2022

gcc и clang отменяют вызов конструктора перемещения в приведенном ниже фрагменте. Это верно?
В приведенном ниже коде объект s класса S используется для инициализации объекта класса D с прямой инициализацией D d(s); . Функция преобразования S :: operator D () используется для преобразования объекта s во временный объект типа D ....
310 просмотров

Передача по значению, приводящая к дополнительному ходу
Я пытаюсь понять семантику перемещения и исключение копирования / перемещения. Мне нужен класс, который собирает некоторые данные. Я хотел бы передать данные в конструктор, и я хотел бы владеть данными. Прочитав это , this и this У меня...
457 просмотров
schedule 20.03.2022

std::pair move не пропущен по определению?
Я заметил кое-что очень странное в Visual Studio 2012: определение объекта пары следующим образом: auto objp = pair<int, LogMe>(); не будет игнорировать копирование/перемещение пары в VC11, этот вызов напечатает: LogMe::LogMe...
336 просмотров

vector.push_back rvalue и копирование
Я push_back превращаю временный объект в vector такой, vector<A> vec; vec.push_back(A("abc")); будет ли компилятор применять copy-elision для создания временного A("abc") непосредственно в vector , так что ctor копирования A не...
1765 просмотров
schedule 27.08.2023

При выполнении копирования-исключения компилятор не рассматривает конструктор копирования в разрешении перегрузки, когда конструктор перемещения удаляется. Почему?
Я могу понять, что компилятор выполняет copy-elision в приведенном ниже коде, поскольку конструкторы копирования и перемещения не вызываются в так называемом copy-initialization , выполненном в main() . См. живой пример . #include...
280 просмотров
schedule 19.02.2023

Используют ли неявные преобразования типа класса конструктор-копию?
Следующая цитата из моей книги C++: Когда мы используем прямую инициализацию, мы просим компилятор использовать обычное сопоставление функций для выбора конструктора, который лучше всего соответствует предоставленным нами аргументам. Когда мы...
443 просмотров

Есть ли какая-то особая причина, по которой конструктор перемещения не опущен в приведенном ниже фрагменте?
gcc , clang и VS2015 не отменяют вызов конструктора перемещения в приведенном ниже коде. , бросив объект a . Мне кажется, что условия, установленные в подпункте (31.2) §8.12 [class.copy] / 31 (N4140), выполнены. #include <iostream>...
264 просмотров
schedule 29.04.2023

Как быть уверенным в оптимизации копии/возвращаемого значения
Я часто возвращаю объекты по значению, предполагая, что произойдет копирование elision/RVO. Но у меня нет хорошего внутреннего понимания компиляторов, и возможность того, что иногда что-то в моем коде может саботировать копирование elision без...
39 просмотров

Будет ли «Гарантированное исключение копирования» (P0135, C++1z) потенциально требовать взлома ABI?
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0135r0.html Вышеупомянутое предложение для «Гарантированного устранения копирования» было включено в рабочий документ C++ на собрании в июне 2016 года в Оулу, Финляндия, за которое затем...
780 просмотров
schedule 22.01.2023

Гарантированное удаление копии и Неперемещаемый{Неперемещаемый{}}
Я обнаружил, что в GCC 7 реализовано гарантированное исключение копирования, и я попробовал следующий код в wandbox : #include <iostream> struct NonMovable { NonMovable() noexcept = default; NonMovable(NonMovable&&)...
429 просмотров
schedule 26.11.2022

Кажется, что копирование происходит даже при компиляции с -fno-elide-constructors
#include <iostream> class A { public: A() { std::cout << "Constructor" << std::endl; } A(const A& a) { std::cout << "Copy Constructor" << std::endl; } A& operator=(const A& a) { std::cout...
125 просмотров
schedule 07.08.2023

Утверждается ли в стандарте, что копии должны быть эквивалентны?
Предположим, у меня есть странный строковый тип, который либо владеет, либо не владеет базовым буфером: class WeirdString { private: char* buffer; size_t length; size_t capacity; bool owns; public: // Non-owning constructor...
305 просмотров

Работает ли гарантированное исключение копирования с параметрами функции?
Если я правильно понял, начиная с C++17, этот код теперь требует, чтобы копирование не выполнялось: Foo myfunc(void) { return Foo(); } auto foo = myfunc(); // no copy Верно ли это и для аргументов функции? Будут ли копии оптимизированы...
823 просмотров