C++ 通过引用移动字符串?

C++ 通过引用移动字符串?,c++,string,C++,String,在我的课堂上,我写了以下几行: string t1,t2; MyClass(std::string tmp1, std::string tmp2) : t1(from), t2(to) {} 为了提高性能,我可以将其更改为: string t1,t2; MyClass(const std::string &tmp1, const std::string &tmp2) : t1(from), t2(to) {} 但是在这种情况下,类成员的原始参数不是共享同一个字符串吗?(两个都

在我的课堂上,我写了以下几行:

string t1,t2;
MyClass(std::string tmp1, std::string tmp2) : t1(from), t2(to) {}
为了提高性能,我可以将其更改为:

string t1,t2;
MyClass(const std::string &tmp1, const std::string &tmp2) : t1(from), t2(to) {}

但是在这种情况下,类成员的原始参数不是共享同一个字符串吗?(两个都指向同一个对象)

让我们从末尾开始:

但是在这种情况下,类成员的原始参数不是共享同一个字符串吗?(两个都指向同一个对象)

每个字符串都是一个单独的值。无论从何处初始化它们,它们之间都不会共享任何内容。如果从
常量初始化字符串&
,数据的副本仍在生成中

为了提高性能,我可以将其更改为:

string t1,t2;
MyClass(const std::string &tmp1, const std::string &tmp2) : t1(from), t2(to) {}
你可以这样做,但这根本不可能改善任何事情。您可能会跳过一个构造函数调用,但实际上无论如何都会优化它

编写此类代码的常用惯用方法是按值捕获,如果需要存储值以备将来使用,则从所述值中移出;否则通过const-ref获取

MyClass(std::string t1, std::string t2) : t1(std::move(t1)), t2(std::move(t2)) {}

让我们从结尾开始:

但是在这种情况下,类成员的原始参数不是共享同一个字符串吗?(两个都指向同一个对象)

每个字符串都是一个单独的值。无论从何处初始化它们,它们之间都不会共享任何内容。如果从
常量初始化字符串&
,数据的副本仍在生成中

为了提高性能,我可以将其更改为:

string t1,t2;
MyClass(const std::string &tmp1, const std::string &tmp2) : t1(from), t2(to) {}
你可以这样做,但这根本不可能改善任何事情。您可能会跳过一个构造函数调用,但实际上无论如何都会优化它

编写此类代码的常用惯用方法是按值捕获,如果需要存储值以备将来使用,则从所述值中移出;否则通过const-ref获取

MyClass(std::string t1, std::string t2) : t1(std::move(t1)), t2(std::move(t2)) {}

这是用于接收器参数的正确模式<代码>++好这是用于接收器参数的正确模式<代码>++好