2016-03-08 15 views
7

Daha önce benzer bir question sorulmuştur, ama hala kafam karıştı. STL, inanıyorum ki, sadece referans olarak geçmek, çok parçalı bir ortamda sonuçlara yol açabileceğinden, sadece değere göre geçer. İki veya daha fazla iş parçacığı değişebilir bir lambda yürütürken, deyin., lambda değerini veya referansı geçmeyi kolaylaştırır.

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

Bu, herhangi bir fonksiyon nesnesine bağlanan sadece const& yaptığınız gibi, ama belki de inlining için kötü bir fikir: Ben sadece bir lambda çağırmak istediğinizde Şu anda evrensel referans kullanın. Bir lambda, kopyalayıcı tarafından derleyici tarafından inline daha kolay aktarılıyor mu? Geçilen lambdaların mümkün olduğunca "inline" olmasını isterim.

+1

Değiştirilebilir lambda nedir? –

+0

mutable \t - \t, kopyanın yakaladığı parametreleri değiştirmesine ve const olmayan üye işlevlerini çağırmasına izin verir – user1095108

+0

Bunun için bir anahtar kelime var. Unut bunu. –

cevap

2

bir işlev çağrısı operatörü ile küçük bir nesne olarak bir lambda Think:

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

Gördüğünüz, fonksiyon vücut kendisi eğer o satır içine yerleştirilmiş olabilir:

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

için biraz eşdeğerdir Aynı çeviri biriminde görüldüğü gibi (ve muhtemelen daha akıllı bazı derleyiciler tarafından olmasa da) görülür. Senin invoke bir şablon olduğundan, bu lamdba gerçek türünü bilir ve büyük bir inlining inhibitörü olan işlev-işaretçi çemberler aracılığıyla atlamak için zorlamazsın. invoke değer veya referans ile çağrılabilir nesne alma

tespit eder bunların önbelleğinde olacak anlamına geliyorsa bir fark işlev gövdesi ya da değil, lokal olarakele değişkenler.

+0

Kopya, önbellek için daha iyi? – user1095108

+0

Bu benim duyduğum şey. Kendi numaramı kullanmam. – BoBTFish

İlgili konular