Như tôi đã hiểu, [=]
sao chép tất cả các biến được sử dụng trong nội dung hàm, trong khi [this]
chỉ sao chép con trỏ this
. Nhưng nhìn vào các mẫu, tôi thấy [=]
được sử dụng rộng rãi trong đó [this]
hoặc [this, foo]
sẽ là đủ. Có bất kỳ lý do nào (ví dụ: đạt được hiệu suất) để sử dụng [this]
thay vì [=]
?Có hiệu suất đạt được nếu tôi sử dụng [this] thay vì [=] trong các hàm lambda không?
Trả lời
Không đạt được hiệu suất, vì như bạn đã nói, chỉ các biến mà bạn thực sự sử dụng bên trong lambda mới được sao chép cho [=]
. † Đó là phần lớn sự lười biếng trên phần của người lập trình và giữ cho đầu lambda súc tích. Nếu bạn sử dụng các biến mới, bạn sẽ phải mở rộng mệnh đề chụp để bao gồm các biến đó và meh. Tuy nhiên, đôi khi, bạn muốn/phải rõ ràng, ví dụ: khi bạn muốn kết hợp tham chiếu theo tham chiếu và theo giá trị.
† Lưu ý rằng hiện nay, các [=]
(hoặc thậm chí [x]
) trong đoạn mã sau sẽ không sao chép các biến thành viên vào lambda, trái với những gì bạn có thể mong đợi:
struct X{
std::function<void()> f(){
return [=]{ std::cout << "x: " << x << "\n"; };
}
int x;
};
Thay vào đó , bạn sẽ nhận được một bản sao của this
. Điều này có thể gây ra vấn đề nếu lambda outlives đối tượng cha mẹ, và để làm cho nó hoạt động chính xác, bạn hiện đang cần phải thực hiện một tên địa phương bên trong cơ thể của f
và nắm bắt/sử dụng đó. Tên này có thể là một tham chiếu hoặc một giá trị. Tôi thích tham chiếu, vì nó là một bản sao ít hơn (để tham chiếu, thành viên sẽ được sao chép chỉ vào lambda, trong khi đối với giá trị, thành viên được sao chép đầu tiên và sau đó được sao chép vào lambda). ‡
struct X{
std::function<void()> f(){
auto& x_ref = x;
return [=]{ std::cout << "x: " << x_ref << "\n"; };
}
int x;
};
Tuy nhiên, there is a proposal để làm cho khoản chụp [=]
và [member_name]
sao chép các thành viên. Nếu bạn muốn tham khảo, bạn cần phải chụp [this]
.
‡ Cảm ơn @MooingDuck vì sự khai sáng.
"và meh" thực sự. Khá đúng! +1 –
Oh điều đó rất thú vị về việc chụp thành viên - có ý nghĩa nhưng không phải là thứ bạn cần nhất định tại chỗ cho đến khi bạn đọc về nó trên Stack Overflow. cảm ơn –
Điều đó thật nhanh, cảm ơn. – kiewic
- 1. nếu điều kiện vs &&, có hiệu suất nào đạt được
- 2. Hiệu suất đạt được từ các phôi kiểu C++?
- 3. Có hiệu suất đạt được từ bộ đệm ẩn $ (điều này) không?
- 4. Có hiệu suất đạt được trong việc loại bỏ các không gian tên không cần thiết (sử dụng) không?
- 5. Hiệu suất thay đổi đáng kể nếu một hàm được di chuyển giữa các mô-đun
- 6. Có hiệu suất chính đạt được bằng cách sử dụng các thủ tục được lưu trữ không?
- 7. Sử dụng _ trong các hàm lambda scala
- 8. Tôi có nên cache $ (this) trong jQuery nếu nó được sử dụng nhiều lần không?
- 9. Có thể sử dụng currying với các hàm lambda không?
- 10. Liệu chúng ta vẫn có hiệu suất đạt được của Java 6 nếu bytecode được biên dịch trong 1.4
- 11. Khi nào nó đáng sử dụng `data.table`? Khi nào tôi có thể mong đợi hiệu suất đạt được lớn nhất?
- 12. Chi phí hiệu suất để sử dụng ref thay vì trả lại các loại tương tự?
- 13. là có bất kỳ loại hiệu suất đạt được trong khi sử dụng các tập tin .pyc trong python?
- 14. Doctrine2 Migration Sử dụng DBAL thay vì $ this-> addSql
- 15. Elixir - là có một hình phạt hiệu suất sử dụng nó thay vì erlang đồng bằng?
- 16. Tôi có nhận được bất kỳ lợi thế hiệu suất nào bằng cách sử dụng VIEW thay vì THAM GIA không?
- 17. Tôi có nên sử dụng NoSQL thay vì MySQL không?
- 18. Tôi có nên sử dụng 'this` trong một lớp học không?
- 19. Sử dụng luồng cho đầu ra đệm để đạt được hiệu suất
- 20. Tôi có thể sử dụng SafeHandle thay vì IntPtr không?
- 21. Có sự xuống cấp hiệu suất khi chúng tôi LUÔN LUÔN sử dụng các loại giá trị không có giá trị thay vì các loại giá trị không?
- 22. Làm thế nào để sử dụng đa thức thay vì bit để cải thiện hiệu suất?
- 23. Tôi có nên sử dụng String thay vì TFilename không?
- 24. Hiệu suất đạt được bằng cách sử dụng thuộc tính Thông tin người gọi
- 25. Tôi có thể sử dụng hàm lambda trong chính nó như thế nào?
- 26. Sử dụng auto trong một hàm lambda
- 27. Hiệu suất đạt được từ GPU với MATLAB?
- 28. Sử dụng các hàm được áp dụng một phần, vấn đề về hiệu suất
- 29. Tôi có thể thay đổi macro này thành hàm nội tuyến mà không có lần truy cập hiệu suất không?
- 30. Tại sao Backbone.View.constructor của tôi .__ super__ undefined nếu tôi sử dụng _.bindAll (this)
Ý bạn là gì bởi "tất cả các biến tham chiếu"? Ý bạn là nói về '[&]'? –
@Lightness: Tôi nghĩ rằng đó là một lỗi đánh máy và ông có nghĩa là "tham chiếu", bất cứ điều gì khác sẽ không thực sự có ý nghĩa. – Xeo
@Xeo: Thật vậy. Tôi sẽ tiếp tục và thay đổi từ ngữ đó cho anh ta. –