Mã này:C++ giá trị trả về tối ưu hóa
#include <vector>
std::vector<float> getstdvec() {
std::vector<float> v(4);
v[0] = 1;
v[1] = 2;
v[2] = 3;
v[3] = 4;
return v;
}
int main() {
std::vector<float> v(4);
for (int i = 0; i != 1000; ++i)
{
v = getstdvec();
}
}
hiểu biết không chính xác của tôi ở đây là các chức năng getstdvec không cần phải thực sự phân bổ các vector rằng nó trở lại. Khi tôi chạy điều này trong valgrind/callgrind, tôi thấy có 1001 cuộc gọi đến malloc; 1 cho khai báo vector ban đầu trong chính và 1000 cho mỗi lần lặp vòng lặp.
Điều gì mang lại? Làm thế nào tôi có thể trả về một vector (hoặc bất kỳ đối tượng nào khác) từ một hàm như thế này mà không phải phân bổ nó mỗi lần?
chỉnh sửa: Tôi biết rằng tôi chỉ có thể chuyển vectơ theo tham chiếu. Tôi đã được ấn tượng rằng nó đã có thể (và thậm chí thích hợp hơn) để viết một chức năng như thế này mà trả về một đối tượng mà không có một phân bổ không cần thiết.
Đối với chỉnh sửa của bạn: Chúng tôi cần một ví dụ thực sự về vấn đề bạn đang cố gắng giải quyết thay vì mã mẫu cực kỳ tối thiểu này để giúp cung cấp giải pháp không vượt qua tham chiếu. –
@MarkB, nó thực sự chỉ đơn giản như vậy: Tôi muốn một hàm trả về một véc-tơ mà không cần phải sao chép/phân bổ không cần thiết. Tôi đã ấn tượng rằng một cái gì đó liên quan đến RVO hoặc rvalues sẽ làm cho điều này rất đơn giản có thể. Một ví dụ thế giới thực đơn giản sẽ cố gắng làm y = k * x cho vectơ y và x, vô hướng k. Hàm truyền qua tham chiếu truyền thống sẽ giống như 'void mult (const float & k, const vec & x, vec & y)'. Nhưng rõ ràng một hàm gọi 'y = mult (k, x)' là thích hợp hơn với 'mult (k, x, y)'. – Aurelius
RVO (Tối ưu hóa giá trị trả về) là thứ mà trình biên dịch thực hiện với mã của bạn. Trước tiên, mã của bạn cần phải làm điều gì đó có thể được tối ưu hóa (chuyển xung quanh một tạm thời được gán lại cho cùng một đối tượng chẳng hạn). Bạn có thể đã xem mã và suy nghĩ - hmm, tôi có thể tối ưu hóa nó bằng cách chuyển tham chiếu đến getstdvec. Tại sao trình biên dịch không làm điều đó? Vâng, việc chuyển một tham chiếu KHÔNG được ngụ ý bởi mã của bạn. Bạn chỉ có thể mong đợi trình biên dịch tối ưu hóa những thứ mà mã của bạn làm - không phải những thứ mà nó có thể làm. – iheanyi