2012-07-06 37 views
11

Variant a:Các so sánh giữa trình vòng lặp và const_iterator có hiệu quả không?

const auto end = whatever.end(); 
for (auto it = whatever.begin(); it != end; ++it) 
{ 
    // ... 
} 

Variant b:

const auto end = whatever.cend(); // note the call to cend insteand of end here 
for (auto it = whatever.begin(); it != end; ++it) 
{ 
    // ... 
} 

Có lý do nào để tin rằng biến thể b sẽ ít hiệu quả hơn so với phiên bản một, vì điều kiện vòng lặp so sánh hai loại khác nhau của vòng lặp? Điều này có gây ra chuyển đổi tiềm ẩn trên it không?

(end được sử dụng nhiều lần bên trong vòng lặp for, do đó mong muốn của tôi treo nó ra.)

+0

Đối với vùng chứa nào? –

+0

@David Trong trường hợp cụ thể của tôi, đó là một 'std :: string', nhưng tôi tò mò nói chung. – fredoverflow

Trả lời

12

Về nguyên tắc, nó có thể là kém hiệu quả và kết quả là một chuyển đổi ngầm với chi phí khác không.

Trong thực tế, iteratorconst_iterator có khả năng tham gia vào một mối quan hệ kế thừa (hoặc là bắt nguồn từ một khác hoặc cả hai bắt nguồn từ _iterator_base) sao cho toán tử bất bình đẳng được xác định trên lớp cơ sở và không cần một chuyển đổi tiềm ẩn (thay vào đó, trình lặp lặp lại có nguồn gốc nhiều hơn bị bỏ qua). Ngay cả khi không có những điều này, việc chuyển đổi có thể là đủ tầm thường để được gạch chân và tối ưu hóa.

libstdC++ tối ưu hóa những so sánh khác nhau, bằng cách định nghĩa operator==operator!= giữa iteratorconst_iterator: http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.3/a02037.html#l00295

libC++ không có bất kỳ tối ưu hóa: http://llvm.org/svn/llvm-project/libcxx/trunk/include/__tree - mặc dù một lần nữa các nhà xây dựng của const_iterator từ iterator rất tầm thường mà tôi muốn hy vọng nó sẽ được tối ưu hóa hoàn toàn.

Các vấn đề liên quan