Tôi biết rằng đó là bình thường không phải là một ý tưởng tốt để trở lại với std::move
, ví dụ:Quay lại với `std :: move` hợp lý trong trường hợp có nhiều câu lệnh trả về?
bigObject foo() { bigObject result; /*...*/ return std::move(result); }
thay vì chỉ đơn giản là
bigObject foo() { bigObject result; /*...*/ return result; }
vì nó được theo cách tối ưu hóa giá trị trả về. Nhưng những gì trong trường hợp của một hàm với nhiều lợi nhuận khác nhau, đặc biệt là một cái gì đó giống như
class bar {
bigObject fixed_ret;
bool use_fixed_ret;
void prepare_object(bigObject&);
public:
bigObject foo() {
if(use_fixed_ret)
return fixed_ret;
else{
bigObject result;
prepare_object(result);
return result;
}
}
};
Tôi nghĩ bình thường tối ưu hóa giá trị trả về là không thể trong một chức năng như vậy, vì vậy nó sẽ là một ý tưởng tốt để đưa vào
return std::move(result);
đây, hay tôi nên thay vì làm (IMO xấu xí, nhưng đó là gây tranh cãi)
bigObject foo() {
bigObject result;
if(use_fixed_ret)
result = fixed_ret;
else{
prepare_object(result);
}
return result;
}
Tôi không thể tham khảo tiêu chuẩn để tôi không trả lời, nhưng tôi chắc chắn rằng bạn không cần std :: di chuyển, tôi nghĩ bạn đang nhầm lẫn RVO và sao chép elision, sao chép elision là tối ưu hóa lợi ích trên một số các trình biên dịch có một đường dẫn trả về đơn. BigObject sẽ trở thành một giá trị R liên quan đến nơi nó trở về. – 111111
Vâng, tôi nghĩ rằng sao chép elision là những gì tôi có nghĩa là trong đầu. – leftaroundabout
Ngoài ra, nếu bạn thích tối ưu hóa mã và mức mã, bạn có vẻ như, :), bạn có thể loại bỏ nhánh 'else {...' khác trong hàm 'foo()' của bạn. Như thể câu lệnh đầu tiên là đúng thì câu thứ hai sẽ không được đánh giá. – 111111