Передача параметров в функцию по указателю и по ссылке
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 18.04.18 10:12
Оценка:
Язык C++ позволяет писать функции, которые возвращают больше одной переменной. Для этого возвращаемые переменные помещаются в список параметров функции, которые там передаются через указатель или через ссылку:

int  myfunc(int *intval, double *doubleval); // передача параметров через указатели


int  myfunc(int &intval, double &doubleval); // передача параметров через ссылки


В чём разница между этими двумя способами? Когда лучше передавать параметры через указатели, а когда--через ссылки?
1613 г. = 2024 г.
Отредактировано 18.04.2018 10:15 RussianFellow . Предыдущая версия .
Re: Передача параметров в функцию по указателю и по ссылке
От: Amygdala Россия  
Дата: 18.04.18 10:18
Оценка:
Здравствуйте, RussianFellow, Вы писали:

В указателе может быть NULL, как особый вариант работы функции, или необязательный параметр. Через ссылку же передается реально существующая переменная и она обязана быть.
Re: Передача параметров в функцию по указателю и по ссылке
От: abrec Россия  
Дата: 18.04.18 10:28
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Язык C++ позволяет писать функции, которые возвращают больше одной переменной. Для этого возвращаемые переменные помещаются в список параметров функции, которые там передаются через указатель или через ссылку:


нынче можно и так http://www.cplusplus.com/forum/beginner/139616/
Re: Передача параметров в функцию по указателю и по ссылке
От: galileo Земля  
Дата: 18.04.18 10:45
Оценка: -1
Здравствуйте, RussianFellow, Вы писали:

RF>В чём разница между этими двумя способами? Когда лучше передавать параметры через указатели, а когда--через ссылки?


всегда (когда возможно) лучше передавать по ссылке, так же как и всегда лучше вередавать констнантную ссылку
Re: Передача параметров в функцию по указателю и по ссылке
От: Анатолий Широков СССР  
Дата: 18.04.18 11:03
Оценка: +2
Здравствуйте, RussianFellow, Вы писали:

RF>Язык C++ позволяет писать функции, которые возвращают больше одной переменной. Для этого возвращаемые переменные помещаются в список параметров функции, которые там передаются через указатель или через ссылку:


RF>В чём разница между этими двумя способами? Когда лучше передавать параметры через указатели, а когда--через ссылки?


по ссылке передавай обязательные параметры, по указателю передавай необязательные.
Отредактировано 18.04.2018 11:07 Анатолий Широков . Предыдущая версия .
Re[2]: Передача параметров в функцию по указателю и по ссылке
От: Videoman Россия https://hts.tv/
Дата: 18.04.18 13:12
Оценка:
Здравствуйте, galileo, Вы писали:

G>всегда (когда возможно) лучше передавать по ссылке, так же как и всегда лучше вередавать констнантную ссылку


Когда функция эквивалентна сеттеру, то лучше передавать по значению, что бы избежать лишнего копирования. Пример:
void B::func(A a)
{
    m_a = std::move(a);
}
Re[3]: Передача параметров в функцию по указателю и по ссылке
От: galileo Земля  
Дата: 18.04.18 14:01
Оценка: +1
Здравствуйте, 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]: Передача параметров в функцию по указателю и по ссылк
От: Анатолий Широков СССР  
Дата: 18.04.18 17:10
Оценка:
Здравствуйте, 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 тяжелый для копирования, получим непроизводительные расходы на копирование во втором случае.
Отредактировано 18.04.2018 17:10 Анатолий Широков . Предыдущая версия .
Re[5]: Передача параметров в функцию по указателю и по ссылк
От: galileo Земля  
Дата: 18.04.18 17:55
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

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 http://cpp.sh/73t5j

ctor
ctor
copy

vs

ctor
copy

Отредактировано 19.04.2018 9:54 свидетель безвиза . Предыдущая версия . Еще …
Отредактировано 18.04.2018 18:28 свидетель безвиза . Предыдущая версия .
Отредактировано 18.04.2018 18:05 свидетель безвиза . Предыдущая версия .
Отредактировано 18.04.2018 18:00 свидетель безвиза . Предыдущая версия .
Re[3]: Передача параметров в функцию по указателю и по ссылке
От: galileo Земля  
Дата: 18.04.18 18:54
Оценка:
Здравствуйте, 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]: Передача параметров в функцию по указателю и по ссылк
От: σ  
Дата: 18.04.18 19:10
Оценка: +1
Здравствуйте, galileo, Вы писали:

G>ctor

G>ctor
G>copy

G>vs


G>ctor

G>copy

Первый ctor — от инициализации поля объекта `B b`
Почему он учтён в "vs"?
Re[5]: Передача параметров в функцию по указателю и по ссылк
От: σ  
Дата: 18.04.18 19:25
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

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


Зато с lvalue хуже https://wandbox.org/permlink/OH2lDAX4Qg8HdMQj. https://wandbox.org/permlink/Q422hrsrI69wPfXb — с деструктором и без copy-and-swap-оператора присваивания.
Отредактировано 18.04.2018 22:36 σ . Предыдущая версия .
Re[6]: Передача параметров в функцию по указателю и по ссылк
От: Анатолий Широков СССР  
Дата: 18.04.18 21:41
Оценка:
Здравствуйте, σ, Вы писали:

σ>Зато с lvalue хуже https://wandbox.org/permlink/OH2lDAX4Qg8HdMQj


Дык, а почему ты включил -DCOPY_AND_SWAP?
Re[7]: Передача параметров в функцию по указателю и по ссылк
От: σ  
Дата: 18.04.18 22:35
Оценка:
σ>>Зато с 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
Re[8]: Передача параметров в функцию по указателю и по ссылк
От: Анатолий Широков СССР  
Дата: 19.04.18 07:29
Оценка:
Здравствуйте, σ, Вы писали:

σ>>>Зато с 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]: Передача параметров в функцию по указателю и по ссылке
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 19.04.18 10:13
Оценка: 1 (1)
Здравствуйте, galileo, Вы писали:

Тут нище писали про оптимизацию
Автор: watchmaker
Дата: 05.04.18
, правда ватчмейкер так и не ответил будет ли работать это для copy-on-write подхода когда именно объект передаёшь.
Sic luceat lux!
Re[4]: Передача параметров в функцию по указателю и по ссылке
От: Videoman Россия https://hts.tv/
Дата: 19.04.18 11:21
Оценка:
Здравствуйте, galileo, Вы писали:

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


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

Тем, что в случае с ссылкой гарантированно будет копирование в случае RValue:
func(A());

В случае передачи по значению копирования тяжелого объекта не будет.
Re[5]: Передача параметров в функцию по указателю и по ссылке
От: galileo Земля  
Дата: 19.04.18 12:55
Оценка:
Здравствуйте, Videoman, Вы писали:

V>Здравствуйте, galileo, Вы писали:


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


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

V>Тем, что в случае с ссылкой гарантированно будет копирование в случае RValue:
V>
V>func(A());
V>

V>В случае передачи по значению копирования тяжелого объекта не будет.

что значит тяжелого?

вот тут я сравнил оба подхода,
http://cpp.sh/73t5j
вы можете привести пример когда func1 выгоднее func2?
Re[6]: Передача параметров в функцию по указателю и по ссылк
От: Videoman Россия https://hts.tv/
Дата: 19.04.18 14:22
Оценка:
Здравствуйте, galileo, Вы писали:

G>вот тут я сравнил оба подхода,

G>http://cpp.sh/73t5j
G>вы можете привести пример когда func1 выгоднее func2?

Зачем вы тестируете без move семантики?
Начиная с С++11 подход с передачей по значению, в случае с сеттером, всегда лучше, либо равен по скорости.
Примеры
Чем класс ближе к размеру ссылки, тем разница меньше. Чем класс и его операции тяжелее, чем выигрыш весомее.
Отредактировано 19.04.2018 14:43 Videoman . Предыдущая версия . Еще …
Отредактировано 19.04.2018 14:31 Videoman . Предыдущая версия .
Отредактировано 19.04.2018 14:30 Videoman . Предыдущая версия .
Re[7]: Передача параметров в функцию по указателю и по ссылк
От: Videoman Россия https://hts.tv/
Дата: 19.04.18 14:31
Оценка:
Извиняюсь Дубликат...
Отредактировано 19.04.2018 14:32 Videoman . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.