Tôi đang học C++ từ một nền tảng chủ yếu là C và Java và tôi tò mò về cách tốt nhất để trả về một đối tượng trong C++ mà không phải sao chép đối tượng. Từ sự hiểu biết của tôi, C++ 11 đã giới thiệu các tham chiếu rvalue (& &) để di chuyển dữ liệu từ một biến tạm thời (ngược lại với việc sao chép). Ví dụ:Trả về một đối tượng trong C++
std::string getStr(){
return "Hello";
}
std::string &&hello = getStr();
Một cách khác tôi có thể nghĩ là sử dụng con trỏ dùng chung.
std::tr1::shared_ptr<std::string> getStr(){
std::tr1::shared_ptr<std::string> hello(new std::string("Hello"));
return hello;
}
auto hello = getStr();
Tôi nghĩ có lẽ một tham chiếu rvalue tốt hơn nhưng tôi muốn có ý kiến thứ hai trước khi tôi sử dụng nó. Cái nào tốt hơn?
Ngoài ra, các trường trong lớp là tham chiếu giá trị nếu chúng không được đặt bằng cách sử dụng hàm tạo? Ví dụ:
class StringHolder{
public:
std::string &&str;
};
StringHolder sh;
sh.str = getStr();
Cảm ơn các bạn rất nhiều!
Bạn có thể tìm thấy [Giới thiệu tóm tắt về tham chiếu Rvalue] (http://www.artima.com/cppsource/rvalue.html) hữu ích –
Triển khai hiện đại của thư viện chuẩn sẽ sử dụng tối ưu hóa chuỗi nhỏ, do đó phân bổ động chuỗi "Hello" có thể chậm hơn so với chỉ trả về một giá trị. – bames53