Lưu ý rằng triển khai ngây thơ đầu tiên của bạn rất bản địa, vì không có gì được chuyển qua tham chiếu. Tôi cho rằng đây là một ví dụ thực sự ngây thơ và không cần phải nhắc nhở độc giả về những lợi ích của việc chuyển qua tham chiếu thay vì bằng giá trị.
Cũng lưu ý rằng tôi đã sử dụng toán tử không phải thành viên, thay vì hàm thành viên, nhưng cuối cùng, kết quả là (gần như) giống nhau.
Nếu bạn muốn chắc chắn không có bản sao cần thiết sẽ được tạo ra, bạn nên thử một phiên bản không điều hành:
void add(Matrix & result, const Matrix & lhs, const Matrix & rhs) ;
Nếu bạn muốn làm điều đó một cách điều hành (đó là giải pháp ưa thích của tôi) , thì bạn nên giả định toán tử + sẽ tạo tạm thời. Sau đó bạn cần xác định cả hai toán tử + và operator + =:
Matrix & operator += (Matrix & result, const Matrix & rhs) ;
{
// add rhs to result, and return result
return result ;
}
Matrix operator + (const Matrix & lhs, const Matrix & rhs) ;
{
Matrix result(lhs) ;
result += rhs ;
return result ;
}
Bây giờ, bạn có thể thử "đòn bẩy" optimisations trình biên dịch và viết nó như:
Matrix & operator += (Matrix & result, const Matrix & rhs) ;
{
// add rhs to result, and return result
return result ;
}
Matrix operator + (Matrix lhs, const Matrix & rhs)
{
return lhs += rhs ;
}
Theo đề xuất của Herb Sutter trong C++ coding tiêu chuẩn, 27. Ưu tiên các hình thức kinh điển của số học và phân công khai thác, p48-49:
Một biến là có toán tử @ [@ being +, -, bất cứ điều gì] chấp nhận thông số đầu tiên của nó theo giá trị. Bằng cách này, bạn sắp xếp cho trình biên dịch để thực hiện sao chép cho bạn một cách ngầm định, và điều này có thể làm cho trình biên dịch mất nhiều thời gian hơn trong việc áp dụng tối ưu hóa.
Ma trận của bạn lớn đến mức nào? Mục tiêu hiệu suất của bạn là gì? Bạn đã thử đo lường hiệu suất hay chi phí của bản sao? –
Nếu các ma trận thậm chí còn lớn hơn một chút, tôi sẽ nghĩ rằng chi phí trả lại ma trận sẽ nhỏ hơn rất nhiều so với thực sự thực hiện bổ sung – randomThought
Tại sao không chuyển thành 'const Matrix & other'? – kennytm