Страницы

Поиск по вопросам

понедельник, 29 апреля 2019 г.

Будет ли копироваться значение при передаче умных указателей в функцию или будет передаваться ссылка?

Например, имеется некоторый класс:
class CSomeClass { double GetLengthLine(std::shared_ptr firstVertex, std::shared_ptr secondVertex) const; }

double CTriangle::GetLengthLine(std::shared_ptr firstVertex, std::shared_ptr secondVertex) const { .... return std::hypot(dx, dy); };
Будет ли копироваться значение при передаче умных указателей в функцию, или будет передаваться ссылка?


Ответ

Если я правильно понял вопрос (хотя на этот счет есть сомнение, т.к. уже имеется принятый ответ), то речь всё же о копировании объекта типа CPoint, которым параметризован std::shared_ptr. В этом случае совершенно не важно как будет передаваться объект умного указателя по ссылке или по значению - это не приведет к дополнительному копированию объекта, хранимого в указателе. Пример:
#include #include
struct S { S() { std::cout << "ctor
"; } S(const S&) { std::cout << "copy
"; } S(S&&) { std::cout << "move
"; } };
void f(std::shared_ptr) {} void g(const std::shared_ptr&) {}
int main(){
auto s = std::make_shared(); f(s); g(s); }
Вывод:
ctor
Т.е. был создан только один объект. Ни копирований, ни перемещений не произошло. Это в принципе логично, т.к. подобным же образом не происходит создания (полезных) объектов при передаче обычных (не умных) указателей.
В общем случае, любой достаточно большой (более нескольких sizeof(int)) объект имеет смысл передавать по константной ссылке, если не предполагается его модифицировать.

Комментариев нет:

Отправить комментарий