auto
có thể hỗ trợ hiệu suất bằng cách tránh các chuyển đổi ngầm im lặng. Một ví dụ tôi thấy hấp dẫn là như sau.
std::map<Key, Val> m;
// ...
for (std::pair<Key, Val> const& item : m) {
// do stuff
}
Xem lỗi? Ở đây, chúng tôi nghĩ rằng chúng tôi đang lấy mọi mục trong bản đồ bằng tham chiếu const và sử dụng biểu thức phạm vi mới để làm rõ ý định của chúng tôi, nhưng thực ra chúng tôi đang sao chép mỗi phần tử. Điều này là do std::map<Key, Val>::value_type
là std::pair<const Key, Val>
, không phải std::pair<Key, Val>
. Vì vậy, khi chúng tôi (ngầm) có:
std::pair<Key, Val> const& item = *iter;
Thay vì tham gia một tham chiếu đến một đối tượng hiện có và để nó ở đó, chúng ta phải làm một loại chuyển đổi. Bạn được phép để có một tham chiếu const đến một đối tượng (hoặc tạm thời) của một loại khác nhau miễn là có một chuyển đổi ngầm có sẵn, ví dụ:
int const& i = 2.0; // perfectly OK
Việc chuyển đổi loại là một chuyển đổi ngầm cho phép đối với lý do tương tự bạn có thể chuyển đổi một số const Key
thành Key
, nhưng chúng tôi phải tạo tạm thời loại mới để cho phép điều đó.Như vậy, hiệu quả của chúng tôi vòng lặp thực hiện:
std::pair<Key, Val> __tmp = *iter; // construct a temporary of the correct type
std::pair<Key, Val> const& item = __tmp; // then, take a reference to it
(Tất nhiên, có không phải là thực sự là một đối tượng __tmp
, nó chỉ có tính minh họa, trong thực tế giấu tên tạm thời chỉ là ràng buộc để item
cho tuổi thọ của pin).
Chỉ cần thay đổi để:
for (auto const& item : m) {
// do stuff
}
chỉ cứu chúng ta một tấn của bản - bây giờ kiểu tham chiếu phù hợp với loại initializer, vì vậy không tạm thời hoặc chuyển đổi là cần thiết, chúng tôi chỉ có thể làm một tài liệu tham khảo trực tiếp.
Xem http://herbsutter.com/2013/06/13/gotw-93-solution-auto-variables-part-2/ nói về việc tránh các chuyển đổi ngầm ngẫu nhiên, ví dụ: từ tiện ích đến tiện ích. Nó không phải là một vấn đề phổ biến. –
Bạn có chấp nhận "làm cho nó ít có khả năng vô tình pessimize" như là một cải tiến hiệu suất? – 5gon12eder
Sự hoàn hảo của việc làm sạch mã chỉ trong tương lai, có thể – Croll