Например, имеется некоторый класс:
class CSomeClass
{
double GetLengthLine(std::shared_ptr
double CTriangle::GetLengthLine(std::shared_ptr
Будет ли копироваться значение при передаче умных указателей в функцию, или будет передаваться ссылка?
Ответ
Если я правильно понял вопрос (хотя на этот счет есть сомнение, т.к. уже имеется принятый ответ), то речь всё же о копировании объекта типа CPoint, которым параметризован std::shared_ptr. В этом случае совершенно не важно как будет передаваться объект умного указателя по ссылке или по значению - это не приведет к дополнительному копированию объекта, хранимого в указателе. Пример:
#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)) объект имеет смысл передавать по константной ссылке, если не предполагается его модифицировать.
Комментариев нет:
Отправить комментарий