Có, sử dụng di chuyển không có bất lợi trong tình huống đó. Tất cả các đối tượng có thể sao chép được tự động di chuyển, vì vậy nó không quan trọng. Trong thực tế, một số người khuyên bạn nên luôn luôn di chuyển các biến khi có thể, ngay cả số nguyên.
Là một thay thế, bạn có thể xem xét sử dụng chuyển tiếp hoàn hảo, như mô tả trong this answer:
template <typename T2>
foo(T2&& t) : m_t(std::forward<T2>(t)) {}
Nếu bạn biết rằng T
định nghĩa một constructor di chuyển nhanh, nó không phải vấn đề. Nếu không, việc cung cấp một hàm tạo foo(const T&)
được khuyến nghị để tránh các bản sao không cần thiết.
Chuyển tiếp hoàn hảo chỉ là một kỹ thuật để đạt được điều đó. Các giải pháp của Pubby để viết ra các nhà xây dựng foo(const T&)
và foo(T&&)
là, tất nhiên, cũng tốt. Kết quả là như nhau, nó chủ yếu là vấn đề về phong cách.
Bạn cũng đã hỏi về các loại số nguyên nhỏ. Theo lý thuyết, việc chuyển chúng bằng tham chiếu chậm hơn so với việc sao chép chúng, nhưng trình biên dịch sẽ có thể tối ưu hóa nó thành một bản sao. Tôi không nghĩ nó sẽ tạo nên sự khác biệt.
Vì vậy, tối ưu hóa tốt hơn cho trường hợp xấu nhất, nơi T
có thể rất lớn và không cung cấp hàm khởi tạo nhanh. Đi qua tham chiếu là tốt nhất cho tình huống đó và cũng không phải là một lựa chọn tồi.
Nguồn
2013-06-10 23:19:49
Cách tham khảo của bạn có tốt hơn tôi không? Nếu T không di chuyển có thể xây dựng được thì (hoặc nên) ngụ ý rằng T là nhỏ/bình thường (không lớn), phải không? Trong trường hợp này bạn có nghĩ rằng một tham chiếu mang lại cho tôi bất kỳ lợi ích hiệu suất có thể đo lường nào không? – 7cows
@ 7có thể mang lại lợi ích hiệu suất có thể đo lường khi T có một hàm tạo bản sao đắt tiền và không có hàm tạo di chuyển nào, thường là với các thư viện C++ 03. Tôi thường thường thích theo cách của bạn. – Pubby