Язык C++ позволяет писать функции, которые возвращают больше одной переменной. Для этого возвращаемые переменные помещаются в список параметров функции, которые там передаются через указатель или через ссылку:
int myfunc(int *intval, double *doubleval); // передача параметров через указатели
int myfunc(int &intval, double &doubleval); // передача параметров через ссылки
В чём разница между этими двумя способами? Когда лучше передавать параметры через указатели, а когда--через ссылки?
В указателе может быть NULL, как особый вариант работы функции, или необязательный параметр. Через ссылку же передается реально существующая переменная и она обязана быть.
Re: Передача параметров в функцию по указателю и по ссылке
Здравствуйте, RussianFellow, Вы писали:
RF>Язык C++ позволяет писать функции, которые возвращают больше одной переменной. Для этого возвращаемые переменные помещаются в список параметров функции, которые там передаются через указатель или через ссылку:
Здравствуйте, RussianFellow, Вы писали:
RF>В чём разница между этими двумя способами? Когда лучше передавать параметры через указатели, а когда--через ссылки?
всегда (когда возможно) лучше передавать по ссылке, так же как и всегда лучше вередавать констнантную ссылку
Re: Передача параметров в функцию по указателю и по ссылке
Здравствуйте, RussianFellow, Вы писали:
RF>Язык C++ позволяет писать функции, которые возвращают больше одной переменной. Для этого возвращаемые переменные помещаются в список параметров функции, которые там передаются через указатель или через ссылку:
RF>В чём разница между этими двумя способами? Когда лучше передавать параметры через указатели, а когда--через ссылки?
по ссылке передавай обязательные параметры, по указателю передавай необязательные.
Здравствуйте, Videoman, Вы писали:
G>>всегда (когда возможно) лучше передавать по ссылке, так же как и всегда лучше вередавать констнантную ссылку
V>Когда функция эквивалентна сеттеру, то лучше передавать по значению, что бы избежать лишнего копирования. Пример: V>
V>void B::func(A a)
V>{
V> m_a = std::move(a);
V>}
V>
чем же это лучше чем это:
void B::func(const A& a)
{
m_a = a;
}
Re[4]: Передача параметров в функцию по указателю и по ссылк
Здравствуйте, galileo, Вы писали:
G>Здравствуйте, Videoman, Вы писали:
G>>>всегда (когда возможно) лучше передавать по ссылке, так же как и всегда лучше вередавать констнантную ссылку
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 тяжелый для копирования, получим непроизводительные расходы на копирование во втором случае.
Здравствуйте, Анатолий Широков, Вы писали:
V>>>Когда функция эквивалентна сеттеру, то лучше передавать по значению, что бы избежать лишнего копирования. Пример: V>>>
V>>>void B::func(A a)
V>>>{
V>>> m_a = std::move(a);
V>>>}
V>>>
АШ>В первом случае в случае передачи rvalue работа идет с одним состоянием, которое перемещается от rvalue до m_a, во втором случае при передаче rvalue работа идет с исходным состоянием и его копией. Если класс A тяжелый для копирования, получим непроизводительные расходы на копирование во втором случае.
А в случае если это не RValue то у нас сначала копирование при вызове функции, а потом move?
И в первом случае у нас (A a) а не (A&& a), разве это гарантированно оптимизируется до "работа идет с одним состоянием, которое перемещается от rvalue до m_a"
И еще, даже если у нас (A&& a), то оно будет работать только с Rvalue, и значит еще придется писать сеттер для копирования
так что я не понимаю как первый вариант может быть предпочтительней, ну или я чего то не понимаю с тем как работает move
Здравствуйте, Videoman, Вы писали:
G>>всегда (когда возможно) лучше передавать по ссылке, так же как и всегда лучше вередавать констнантную ссылку
V>Когда функция эквивалентна сеттеру, то лучше передавать по значению, что бы избежать лишнего копирования. Пример: V>
V>void B::func(A a)
V>{
V> m_a = std::move(a);
V>}
V>
передавать по значению лучше когда размер объекта меньше либо равен размеру указателя, но тут уже можно не париться с мувами
например
void B::func(int a)
{
m_a = a;
}
Re[6]: Передача параметров в функцию по указателю и по ссылк
Здравствуйте, Анатолий Широков, Вы писали:
АШ>В первом случае в случае передачи rvalue работа идет с одним состоянием, которое перемещается от rvalue до m_a, во втором случае при передаче rvalue работа идет с исходным состоянием и его копией. Если класс A тяжелый для копирования, получим непроизводительные расходы на копирование во втором случае.
Дык, COPY_AND_SWAP реализует идею "Когда функция эквивалентна сеттеру, то лучше передавать по значению".
Без COPY_AND_SWAP для lvalue 2 вызова вместо одного при передаче по значению.
Здравствуйте, σ, Вы писали:
σ>>>Зато с lvalue хуже https://wandbox.org/permlink/OH2lDAX4Qg8HdMQj
АШ>>Дык, а почему ты включил -DCOPY_AND_SWAP?
σ>Дык, COPY_AND_SWAP реализует идею "Когда функция эквивалентна сеттеру, то лучше передавать по значению". σ>Без COPY_AND_SWAP для lvalue 2 вызова вместо одного при передаче по значению.
σ>Кстати, забыл деструктор показать. Вот, без COPY_AND_SWAP https://wandbox.org/permlink/Q422hrsrI69wPfXb
Для класса действует правило 5. Коль скоро ты определить move constructor, то, будь добр, определи и move assignment operator.
Re[4]: Передача параметров в функцию по указателю и по ссылке
Здравствуйте, galileo, Вы писали:
G>вот тут я сравнил оба подхода, G>http://cpp.sh/73t5j G>вы можете привести пример когда func1 выгоднее func2?
Зачем вы тестируете без move семантики?
Начиная с С++11 подход с передачей по значению, в случае с сеттером, всегда лучше, либо равен по скорости. Примеры
Чем класс ближе к размеру ссылки, тем разница меньше. Чем класс и его операции тяжелее, чем выигрыш весомее.