2013-06-10 32 views
40

Trong C++ 11, tôi có thể lặp qua một số container như vậy:C++ 11 Phạm vi có trụ sở tại vòng hiệu quả "const auto & i" so với "tự động i"

for(auto i : vec){ 
    std::cout << i << std::endl; 
} 

Nhưng tôi biết rằng này không cần thiết - không cần thiết, kể từ khi tôi chỉ cần in các giá trị của vec - tạo một bản sao của (EDIT: mỗi phần tử của) vec, vì vậy thay vào đó tôi có thể làm:

for(auto &i : vec){ 
    std::cout << i << std::endl; 
} 

Nhưng tôi muốn chắc chắn rằng các giá trị của vec không bao giờ được sửa đổi và tuân theo const-đúng đắn, vì vậy tôi có thể làm:

for(const auto &i : vec){ 
    std::cout << i << std::endl; 
} 

Vì vậy, câu hỏi của tôi là: Nếu tôi chỉ cần nhìn tại giá trị của một số thùng chứa, không phải vòng lặp cuối cùng (const auto &i) luôn được ưu tiên do tăng hiệu quả không có thêm bản sao (EDIT: mỗi phần tử) vec?

Tôi có một chương trình mà tôi đang phát triển, trong đó tôi đang xem xét thực hiện thay đổi này trong suốt, vì hiệu quả rất quan trọng trong đó (lý do tôi sử dụng C++ ở vị trí nắm tay).

+1

Có, nếu bạn chỉ cần truy cập đọc vào một đối số, nó phải thông qua 'tự động const &' để tránh một bản sao không cần thiết. – 0x499602D2

+2

Từ khóa "const" không làm cho mã của bạn nhanh hơn ... – Tim

+4

'for (auto i: vec)' không tạo thêm một bản sao của toàn bộ 'vec', nó sao chép mỗi _element_ của' vec' vào 'i'. – Casey

Trả lời

54

Có. Lý do tương tự nếu bạn chỉ đọc một đối số bạn thực hiện tham số const&.

T  // I'm copying this 
T&  // I'm modifying this 
const T& // I'm reading this 

Đó là "giá trị mặc định" của bạn. Khi T là loại cơ bản (được tích hợp sẵn), tuy nhiên, bạn thường chỉ hoàn nguyên về số const T (không có tham chiếu) để đọc vì bản sao rẻ hơn so với đặt bí danh.


tôi có một chương trình mà tôi đang phát triển trong đó tôi đang xem xét việc thay đổi này trong suốt, vì hiệu quả là rất quan trọng trong đó

  1. Đừng làm thay đổi sâu rộng mù . Chương trình làm việc tốt hơn chương trình nhanh nhưng bị hỏng.
  2. Cách bạn lặp qua các vòng lặp của bạn có thể sẽ không tạo ra nhiều khác biệt; bạn đang lặp lại vì một lý do, phải không? Cơ thể của vòng lặp của bạn sẽ có nhiều khả năng là thủ phạm.
  3. Nếu hiệu quả là rất quan trọng, bạn muốn sử dụng một profiler để tìm ra các phần của chương trình của bạn là thực chậm, chứ không phải đoán tại bộ phận mà có thể chậm. Xem # 2 cho lý do tại sao đoán của bạn có thể sai.
+0

"bản sao rẻ hơn so với bí danh" chỉ với hầu hết các loại cơ bản, ngoài ngữ nghĩa di chuyển không thể được sử dụng trong tình huống của OP và vì T có thể là bất kỳ loại nào, tham chiếu sẽ là lựa chọn đúng. – Tim

+1

"*" sao chép rẻ hơn so với răng cưa "chỉ với hầu hết các loại cơ bản *" Đó là lý do tại sao nửa đầu của câu đó là dành riêng để nói rằng nó áp dụng cho các loại cơ bản ...? Rõ ràng nếu bạn không biết loại, bạn sử dụng trường hợp chung. – GManNickG

+0

Xin lỗi, tôi phải đọc qua nó. – Tim

0

Hãy tưởng tượng nếu vectơ của bạn chứa chuỗi. Chuỗi dài. 5000 chuỗi dài. Sao chép chúng một cách không cần thiết và bạn kết thúc bằng một vòng lặp được viết độc đáo vô cùng hiệu quả.

Đảm bảo mã của bạn tuân theo ý định của bạn. Nếu bạn không cần một bản sao bên trong vòng lặp, đừng tạo một bản sao.

Sử dụng tham chiếu & như được đề xuất ở trên hoặc trình lặp.

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