Как лучше передавать объект в функцию?
От: Максим Рогожин Россия  
Дата: 06.04.18 19:40
Оценка:
Привет,
объясните, пожалуйста, как правильно/лучше делать если функции нужно только читать какие-то свойства объекта, но не нужно его менять:
class Document;

class DocumentAnalyser {
public:
   virtual bool analyse(const Document* doc) const; // передавать по указателю?
   virtual bool analyse(const shared_ptr<Document> doc) const; // или по shared_ptr лучше?
};

shared_ptr<Document> nextDocument();
documentAnalyser->analyse(nextDocument().get()); // так?
documentAnalyser->analyse(nextDocument()); // или так?


Если приложение однопоточное, то по указателю достаточно. А если многопоточное и другой поток может удалить документ, то тогда по shared_ptr. Правильно?

UPDATE:
А если nextDocument() вот так объявлена:
std::unique_ptr nextDocument();

тогда как лучше?
Отредактировано 06.04.2018 19:47 Максим Рогожин . Предыдущая версия . Еще …
Отредактировано 06.04.2018 19:43 Максим Рогожин . Предыдущая версия .
Re: Как лучше передавать объект в функцию?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 06.04.18 20:02
Оценка:
Здравствуйте, Максим Рогожин, Вы писали:


МР>Если приложение однопоточное, то по указателю достаточно. А если многопоточное и другой поток может удалить документ, то тогда по shared_ptr. Правильно?


shared_ptr разве tread safe?
Маньяк Робокряк колесит по городу
Re[2]: Как лучше передавать объект в функцию?
От: Максим Рогожин Россия  
Дата: 06.04.18 20:45
Оценка:
Здравствуйте, Marty, Вы писали:

M>shared_ptr разве tread safe?


А, ну да, другой поток может менять объект пока я его читаю... Ну так есть разница передавать по указателю или по shared_ptr? И вообще как правильно делать?
Re[3]: Как лучше передавать объект в функцию?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 06.04.18 20:56
Оценка: +5
Здравствуйте, Максим Рогожин, Вы писали:

M>>shared_ptr разве tread safe?


МР>А, ну да, другой поток может менять объект пока я его читаю... Ну так есть разница передавать по указателю или по shared_ptr? И вообще как правильно делать?


Управление временем жизни объекта и управление его содержимым в многопоточной среде — это ортогональные вещи
Маньяк Робокряк колесит по городу
Re[4]: Как лучше передавать объект в функцию?
От: Максим Рогожин Россия  
Дата: 06.04.18 21:03
Оценка:
Здравствуйте, Marty, Вы писали:

M>Управление временем жизни объекта и управление его содержимым в многопоточной среде — это ортогональные вещи


Я просто вижу в проекте в одних местах передается по указателю, в других по shared_ptr и хочу разобраться от чего это зависит и как надо правильно делать.
Re[5]: Как лучше передавать объект в функцию?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 06.04.18 21:19
Оценка:
Здравствуйте, Максим Рогожин, Вы писали:


M>>Управление временем жизни объекта и управление его содержимым в многопоточной среде — это ортогональные вещи


МР>Я просто вижу в проекте в одних местах передается по указателю, в других по shared_ptr и хочу разобраться от чего это зависит и как надо правильно делать.


Если нет документации — беги оттуда
Маньяк Робокряк колесит по городу
Re[6]: Как лучше передавать объект в функцию?
От: Максим Рогожин Россия  
Дата: 06.04.18 21:26
Оценка:
Здравствуйте, Marty, Вы писали:

M>Если нет документации — беги оттуда


Т.е. общепринятого подхода в C++ к этому вопросу нет — это зависит от дизайна конкретного проекта. Так?
Re[7]: Как лучше передавать объект в функцию?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 06.04.18 21:37
Оценка: 2 (1)
Здравствуйте, Максим Рогожин, Вы писали:

M>>Если нет документации — беги оттуда


МР>Т.е. общепринятого подхода в C++ к этому вопросу нет — это зависит от дизайна конкретного проекта. Так?


Так
Маньяк Робокряк колесит по городу
Re: Как лучше передавать объект в функцию?
От: mbait  
Дата: 06.04.18 22:38
Оценка: -3
Здравствуйте, Максим Рогожин, Вы писали:

МР>Привет,

МР>объясните, пожалуйста, как правильно/лучше делать если функции нужно только читать какие-то свойства объекта, но не нужно его менять:
МР>
МР>class Document;

МР>class DocumentAnalyser {
МР>public:
МР>   virtual bool analyse(const Document* doc) const; // передавать по указателю?
МР>   virtual bool analyse(const shared_ptr<Document> doc) const; // или по shared_ptr лучше?
МР>};

МР>shared_ptr<Document> nextDocument();
МР>documentAnalyser->analyse(nextDocument().get()); // так?
МР>documentAnalyser->analyse(nextDocument()); // или так? 
МР>


МР>Если приложение однопоточное, то по указателю достаточно. А если многопоточное и другой поток может удалить документ, то тогда по shared_ptr. Правильно?


МР>UPDATE:

МР>А если nextDocument() вот так объявлена:
МР>
МР>std::unique_ptr nextDocument();
МР>

МР>тогда как лучше?

Лучше по указателю, потому что сейчас у вас shared_ptr, потом unique_ptr, потом uber_mega_c++2020_ai_ptr, а указатель как был, так и останется. Дополнительно, в принимающем интерфейсе я бы заменил указатель на ссылку.
Re[2]: Как лучше передавать объект в функцию?
От: mbait  
Дата: 06.04.18 22:56
Оценка: 2 (1)
Более того, в случае со ссылкой интерфейс умного указателя становится прозрачным, потому что для доступа с содержимому используется не .get() или что-то ещё, а de-reference syntax:

class Document;

class DocumentAnalyser {
public:
   virtual bool analyse(const Document& doc) const;
};

any_ptr<Document> nextDocument();
documentAnalyser->analyse(*nextDocument());
Re[3]: Как лучше передавать объект в функцию?
От: σ  
Дата: 07.04.18 10:28
Оценка:
Здравствуйте, mbait, Вы писали:

M>Более того, в случае со ссылкой интерфейс умного указателя становится прозрачным, потому что для доступа с содержимому используется не .get() или что-то ещё, а de-reference syntax:


В случае указателя, а не ссылки, можно использовать пару операторов &* вместо .get()
Re[2]: Как лучше передавать объект в функцию?
От: Mr.Delphist  
Дата: 07.04.18 13:45
Оценка: +1
Здравствуйте, mbait, Вы писали:

M>Лучше по указателю, потому что сейчас у вас shared_ptr, потом unique_ptr, потом uber_mega_c++2020_ai_ptr, а указатель как был, так и останется. Дополнительно, в принимающем интерфейсе я бы заменил указатель на ссылку.


Суть в том, что сложные сценарии могут сделать невозможным определение ситуации "когда удалить объект по указателю". И shared_ptr как раз отвечает на этот вопрос. А unique_ptr имеет совсем конкретный сценарий: удалить сразу как только выходим за пределы scope, при этом не позволять копирование.

Работа с сырым указателем — да, можно, но... буханка-тролейбус.jpg
А убер-указатели просто так не появляются — там чётко проговаривается сценарий применения.
Re[7]: Как лучше передавать объект в функцию?
От: Caracrist https://1pwd.org/
Дата: 07.04.18 19:02
Оценка:
Здравствуйте, Максим Рогожин, Вы писали:


МР>Т.е. общепринятого подхода в C++ к этому вопросу нет — это зависит от дизайна конкретного проекта.


общепринятости быть не может, вопрос в интерфейсе. бывает функция принимает shared_ptr и, соответсвенно, может сохранить его "у себя", бывает что указателя дотаточно и тем самым функция "говорит", что она будет обращаться к объекту только в теле, бывает ещё unique_ptr в интерфейсе и это значит, что функция ожидает эксклюзивный доступ, есть ещё много разных указателей дающих разную семантику (copy-on-write, create-shared-only, enable-ptr-from-this, и т.д...)
~~~~~
~lol~~
~~~ Single Password Solution
Re: Как лучше передавать объект в функцию?
От: landerhigh Пират  
Дата: 08.04.18 00:27
Оценка: 2 (1) +2
Здравствуйте, Максим Рогожин, Вы писали:

class Document;

class DocumentAnalyser {
public:
   virtual bool analyse(const Document& doc) const; 
};


Если свойства только читать, то передавать по константной ссылке.
Проблемы времени жизни объекта в многопоточной среде рассматривать отдельно.
www.blinnov.com
Отредактировано 08.04.2018 10:05 landerhigh . Предыдущая версия .
Re: Как лучше передавать объект в функцию?
От: Анатолий Широков СССР  
Дата: 08.04.18 07:45
Оценка: 2 (1)
Здравствуйте, Максим Рогожин, Вы писали:

МР>Привет,

МР>объясните, пожалуйста, как правильно/лучше делать если функции нужно только читать какие-то свойства объекта, но не нужно его менять:

Если передаваемый объект должен жить столько, сколько требуется DocumentAnalyser передавай shared_ptr и храни shared_ptr. Если передаваемый документ может умереть в процессе обработки, то передавай shared_ptr и храни weak_ptr. Умные указатели не осуществляют контроль доступа к хранимому объекту в многопоточной среде, поэтому здесь уже сам навешивай мьютекты, атомики и т.д. и т.п.
Re: Как лучше передавать объект в функцию?
От: galileo Земля  
Дата: 10.04.18 09:30
Оценка: 2 (1)
Здравствуйте, Максим Рогожин, Вы писали:

лучше const Document&
передавать const shared_ptr<Document> вообще нет смысла, потому что это функция, и ты увеличиваешь counter на время выполнения функции — а это дорого.

если же нужно в этой функции куда то передать shared_ptr во владение комуто, то дучше const shared_ptr<Document>&
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.