Sự chuyên môn của std::swap
bây giờ là không bắt buộc, nhưng không phản đối. Lý do là hiệu suất.
Để tạo mã mẫu và thậm chí có thể cho nhiều mã vận chuyển, std::swap
sẽ nhanh hơn rất nhiều. Tuy nhiên nếu bạn đang ở trong một tình huống mà bạn cần phải eek ra mỗi chút từ mã của bạn, viết một trao đổi tùy chỉnh vẫn có thể là một lợi thế hiệu suất đáng kể.
Hãy xem xét trường hợp lớp của bạn về cơ bản có một con trỏ đang sở hữu và hàm tạo di chuyển của bạn và nhiệm vụ di chuyển chỉ phải đối phó với một con trỏ đó.Đếm tải và lưu trữ máy cho mỗi thành viên:
Di chuyển hàm khởi tạo: 1 tải và 2 cửa hàng.
Di chuyển bài tập: 2 tải và 2 cửa hàng.
Hoán đổi tùy chỉnh: 2 lượt tải và 2 cửa hàng.
std::swap
là 1 lần di chuyển và 2 bài tập di chuyển hoặc: 5 lượt tải và 6 cửa hàng.
Hoán đổi tùy chỉnh có khả năng vẫn nhanh hơn hai hoặc ba lần so với std::swap
. Mặc dù bất cứ lúc nào bạn đang cố gắng tìm ra tốc độ của một cái gì đó bằng cách đếm tải và các cửa hàng, cả hai sẽ được nhanh chóng ác.
Lưu ý: Khi tính toán chi phí chuyển nhượng di chuyển của bạn, hãy đảm bảo và xem xét rằng bạn sẽ chuyển sang giá trị được chuyển từ (trong thuật toán std::swap
). Điều này thường phủ nhận chi phí của một deallocation, mặc dù với chi phí của một chi nhánh.
Nguồn
2011-12-23 15:04:55
Tôi muốn nói điều này đã được đề cập bởi Scott hoặc Herb tại _C++ và Beyond_, nhưng tôi dường như không thể tìm thấy bất cứ điều gì về nó. –
Liên quan: [Di chuyển ngữ nghĩa == chức năng hoán đổi tùy chỉnh lỗi thời?] (Http://stackoverflow.com/questions/6416385/move-semantics-custom-swap-function-obsolete) – Xeo
@Xeo: Cảm ơn, tôi đã hoàn toàn quên mất câu hỏi/câu trả lời đó. Tôi có được điểm cho phù hợp không? :-) Tôi chắc chắn sẽ bị đỏ mặt khác! –