2016-03-08 13 views
7

Tương tự question đã được hỏi trước đó, nhưng tôi vẫn còn bối rối. STL, tôi tin rằng, độc quyền đi qua giá trị, như đi qua tham chiếu có thể có hậu quả trong một môi trường đa luồng. Nói, khi hai hoặc nhiều luồng đang thực hiện một lambda có thể thay đổi. Tôi hiện đang sử dụng một tham chiếu phổ biến khi tôi chỉ muốn gọi một lambda:không truyền lambda theo giá trị hoặc tham chiếu giúp nội tuyến dễ dàng hơn không?

template <typename F> 
inline void invoke(F&& f) 
{ 
    f(); 
} 

này liên kết với bất kỳ đối tượng chức năng, giống như một const& sẽ, nhưng có lẽ đó là một ý tưởng tồi cho nội tuyến. Là một lambda thông qua bản sao dễ dàng hơn để inline bởi trình biên dịch? Tôi muốn các lambdas được thông qua là "không thể khắc phục" càng tốt.

+1

lambda có thể thay đổi là gì? –

+0

có thể thay đổi \t - \t cho phép cơ thể sửa đổi các thông số được chụp bằng bản sao và gọi các chức năng thành viên không phải của họ – user1095108

+0

Ồ, có một từ khóa cho điều đó. Quên nó đi. –

Trả lời

2

nghĩ về một lambda như một đối tượng nhỏ với một nhà điều hành chức năng cuộc gọi:

int foo = 1000; 
auto f = [=]() ->int { return foo; }; 

có phần tương đương với:

class FooLambda { 
    int foo; 
    public: 
    FooLambda(int foo) : foo(foo) {} 
    int operator()(){ return foo; } 
}; 
// ... 
int foo = 1000; 
FooLambda f(foo); 

Vì vậy, bạn thấy, các cơ quan chức năng chính nó có thể được inlined nếu nó được thấy trong cùng một đơn vị dịch như nó được gọi (và có thể nếu không phải bởi một số trình biên dịch thông minh hơn). Vì invoke của bạn là một mẫu, nó biết loại thực tế của lamdba, và bạn không ép buộc nó nhảy qua các vòng lặp con trỏ hàm, một chất ức chế lớn của nội tuyến.

Lấy đối tượng có thể được gọi bằng giá trị hoặc tham chiếu trong invoke xác định xem biến bắt là địa phương để các cơ quan chức năng hay không, có thể tạo sự khác biệt nếu nó có nghĩa là họ sẽ có trong bộ nhớ cache.

+0

Sao chép tốt hơn cho bộ nhớ cache mà tôi cho là? – user1095108

+0

Đó là những gì tôi đã nghe. Chưa chạy số riêng của tôi. – BoBTFish

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