Информация об изменениях

Сообщение Re[5]: Передача параметров в функцию по указателю и по ссылк от 18.04.2018 17:55

Изменено 18.04.2018 18:28 свидетель безвиза

Re[5]: Передача параметров в функцию по указателю и по ссылк
Здравствуйте, Анатолий Широков, Вы писали:

V>>>Когда функция эквивалентна сеттеру, то лучше передавать по значению, что бы избежать лишнего копирования. Пример:

V>>>
V>>>void B::func(A a)
V>>>{
V>>>    m_a = std::move(a);
V>>>}
V>>>


G>>чем же это лучше чем это:


G>>
G>>void B::func(const A& a)
G>>{
G>>    m_a = a;
G>>}
G>>


АШ>В первом случае в случае передачи rvalue работа идет с одним состоянием, которое перемещается от rvalue до m_a, во втором случае при передаче rvalue работа идет с исходным состоянием и его копией. Если класс A тяжелый для копирования, получим непроизводительные расходы на копирование во втором случае.


А в случае если это не RValue то у нас сначала копирование при вызове функции, а потом move?
И в первом случае у нас (A a) а не (A&& a), разве это гарантированно оптимизируется до "работа идет с одним состоянием, которое перемещается от rvalue до m_a"
И еще, даже если у нас (A&& a), то оно будет работать только с Rvalue, и значит еще придется писать сеттер для копирования
так что я не понимаю как первый вариант может быть предпочтительней, ну или я чего то не понимаю с тем как работает move
Re[5]: Передача параметров в функцию по указателю и по ссылк
Здравствуйте, Анатолий Широков, Вы писали:

V>>>Когда функция эквивалентна сеттеру, то лучше передавать по значению, что бы избежать лишнего копирования. Пример:

V>>>
V>>>void B::func(A a)
V>>>{
V>>>    m_a = std::move(a);
V>>>}
V>>>


G>>чем же это лучше чем это:


G>>
G>>void B::func(const A& a)
G>>{
G>>    m_a = a;
G>>}
G>>


АШ>В первом случае в случае передачи rvalue работа идет с одним состоянием, которое перемещается от rvalue до m_a, во втором случае при передаче rvalue работа идет с исходным состоянием и его копией. Если класс A тяжелый для копирования, получим непроизводительные расходы на копирование во втором случае.


А в случае если это не RValue то у нас сначала копирование при вызове функции, а потом move?
И в первом случае у нас (A a) а не (A&& a), разве это гарантированно оптимизируется до "работа идет с одним состоянием, которое перемещается от rvalue до m_a"
И еще, даже если у нас (A&& a), то оно будет работать только с Rvalue, и значит еще придется писать сеттер для копирования
так что я не понимаю как первый вариант может быть предпочтительней, ну или я чего то не понимаю с тем как работает move

таки решил проверить

http://cpp.sh/9spim

ctor
ctor
copy

vs

ctor
copy