Tôi sử dụng tài liệu tham khảo. Điều đó cho phép người triển khai thực hiện và trừu tượng lựa chọn, mà không đánh thuế khách hàng nhiều (một số trường hợp quan trọng, một số sẽ không).
Tôi cũng sử dụng chúng cho phong cách nhất quán - Tôi không thích nhìn thấy giao diện công cộng đi qua chi tiết triển khai của chúng.
Giao dịch chuyển tiếp và bản sao có thể tốn kém - nó thay đổi rất nhiều theo loại bạn đang chuyển. Để trở về theo giá trị cho biết loại nên được trivially constructible, swappable, copyable, movable. Trình biên dịch có thể thực hiện một số tối ưu hóa tuyệt vời trong lĩnh vực này (RVO/di chuyển), nhưng bạn cũng có thể đưa ra các quyết định sáng suốt để giảm thiểu các hoạt động tốn kém trong việc triển khai của bạn. Một khi bạn không còn sử dụng các loại, mọi người đều biết các đặc điểm sao chép, sau đó chọn cách trở về trở nên rất phức tạp, vì vậy tôi chỉ giữ cho nó đơn giản và ưu tiên các tham chiếu.
Việc chuyển tham chiếu có một vài lợi ích khác, chẳng hạn như khi khách hàng muốn sử dụng lớp con của loại được chuyển.
Một lợi ích khác nếu bạn cần một chương trình được tối ưu hóa: Tôi thường sẽ xóa bản sao ctor và operator=
nếu chúng không nhỏ hoặc có thể. Đi qua tham chiếu có thể thay đổi cho phép bạn làm việc với các loại không được sao chép/gán.
Trong phạm vi nghiêm ngặt của std::string
được sử dụng trong câu hỏi này: Trả lại giá trị std::string
là khá phổ biến và nhiều tối ưu hóa đã được thực hiện cụ thể cho trường hợp này - RVO, COW và di chuyển là một số điều đáng chú ý. Như Voo đã đề cập trong phần bình luận dưới đây, việc trả về theo giá trị thường dễ đọc hơn. Trong trường hợp của std::string
và các chương trình cấp cao hơn, việc trả về theo giá trị không có khả năng là vấn đề, nhưng điều quan trọng là phải đo lường chi phí liên quan đến việc triển khai thư viện chuẩn mà bạn đang sử dụng nếu hiệu suất là quan trọng (câu hỏi của bạn có thể là trường hợp).
Điều quan trọng là nếu bạn đang cố gắng cải thiện chương trình hiện tại, hãy đảm bảo bạn hiểu cách triển khai thực hiện và tìm hiểu cách sử dụng các loại hiệu quả nhất khi hiệu suất là quan trọng. Việc triển khai có thể được viết và tối ưu hóa cho việc sử dụng thực tế sử dụng, có nghĩa là chúng có thể bi quan và đoán lần thứ hai bạn trong một số trường hợp và nỗ lực cải thiện hiệu suất của bạn có thể đã được triển khai hoặc sử dụng độc đáo loại có thể làm suy giảm hiệu suất. Hành vi thay đổi kích thước điển hình của một std::vector
là một ví dụ rõ ràng. Việc sử dụng đường hiệu suất cao sẽ làm tăng thêm thời gian và sự phức tạp về những gì bạn cần biết để đạt được kết quả tốt nhất, và điều này rõ ràng khác nhau tùy theo cách bạn sử dụng và cả các loại bạn đang sử dụng. Nếu hiệu suất là các khoản đầu tư thời gian quan trọng và đáng giá, việc tìm hiểu hoạt động của các loại bạn sử dụng là một nỗ lực đáng giá có thể dẫn đến lợi ích đáng kể.
Tôi cũng nên thêm rằng tôi làm việc ở mức độ thấp khá thường xuyên - Trường hợp hiệu suất là quan trọng và/hoặc tài nguyên bị giới hạn. Có thể có nhiều hạn chế, bao gồm không có ngoại lệ, không có khóa (cũng ngụ ý không phân bổ đống), chi phí trừu tượng tối thiểu và thậm chí hạn chế sử dụng đa hình động. Nó có thể được coi là một miền khá đòi hỏi, ngay cả đối với C++. Tôi chọn tham chiếu cho các phần cấp thấp cốt lõi, nhưng tôi sẽ thư giãn quy tắc đó nếu tôi biết một chương trình sẽ chỉ được sử dụng trong các miền cấp cao hơn hoặc các bài kiểm tra đơn vị.
Vui lòng sử dụng nút '{}' trong trình chỉnh sửa để định dạng mã. – Mat
Bạn có * nghiêm túc * lo lắng về những "lần" bạn nói đến không? Bạn đã làm hồ sơ và xác định rằng thời gian xây dựng chuỗi là nút cổ chai của ứng dụng của bạn? –