Nếu tôi sử dụng auto_ptr như một giá trị trả về của một hàm mà populates vectơ lớn, điều này làm cho các chức năng một hàm nguồn (nó sẽ tạo ra một auto_ptr nội bộ và vượt qua quyền sở hữu khi nó trả về một tổ chức phi const auto_ptr). Tuy nhiên, tôi không thể sử dụng hàm này với các thuật toán STL bởi vì, để truy cập dữ liệu, tôi cần phải bỏ đăng ký lại auto_ptr. Một ví dụ tốt, tôi đoán sẽ là một trường vectơ có kích thước N, với mỗi vectơ có 100 thành phần. Wether chức năng trả về mỗi vector thành phần 100 theo giá trị hoặc bởi ref là không giống nhau, nếu N là lớn.trở lại giá trị tối ưu hóa vs auto_ptr cho vectơ lớn
Ngoài ra, khi tôi cố gắng mã rất cơ bản này:
class t
{
public:
t() { std::cout << "ctor" << std::endl; }
~t() { std::cout << "dtor" << std::endl; }
};
t valueFun()
{
return t();
}
std::auto_ptr<t> autoFun()
{
return std::auto_ptr(new t());
}
cả autoFun và các cuộc gọi vui là kết quả với sản lượng
ctor Dtor
vì vậy tôi có thể không thực sự thấy biến tự động mà đang được tạo ra để được thông qua cho câu lệnh trả về. Điều này có nghĩa là Tối ưu hóa giá trị trả lại được đặt cho lệnh gọi valueFun không? Liệu valueFun tạo ra hai đối tượng tự động ở tất cả trong trường hợp này?
Làm cách nào để tối ưu hóa một tập hợp cấu trúc dữ liệu lớn với chức năng?
Bạn có hỏi liệu RVO cũng sẽ hoạt động cho các vectơ lớn của bạn không? Nếu vậy, bạn có thể thử nghiệm nó với một ví dụ như trên không? – juanchopanza
Khi tôi kiểm tra nó, nó có nghĩa là nó hoạt động cho tất cả các trình biên dịch/nền tảng? Làm thế nào để tôi biết RVO được bao gồm ở tất cả, tôi nên đọc các thông số kỹ thuật của trình biên dịch? Điều gì sẽ xảy ra nếu mã được biên dịch trên một cụm HPC với trình biên dịch khác và thư viện lớn? – tmaric
Vâng, tôi thấy quan điểm của bạn. Đó là một trong những thứ mà trình biên dịch được phép, nhưng không bắt buộc phải làm, vì vậy bạn không bao giờ có thể chắc chắn. BTW bạn có hỗ trợ C++ 11 không? – juanchopanza