2016-03-08 8 views
7

Un simile question è stato chiesto prima, ma sono ancora confuso. L'STL, credo, passa esclusivamente per valore, in quanto il passaggio per riferimento potrebbe avere conseguenze in un ambiente multi-thread. Dì, quando due o più thread eseguono un lambda mutabile. Attualmente uso un riferimento universale, quando voglio solo richiamare un lambda:il passaggio lambda in base al valore o al riferimento rende più semplice l'inline?

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

Questo si lega a qualsiasi oggetto funzione, proprio come una const& sarebbe, ma forse è una cattiva idea per inline. Un lambda passato per copia è più facile da incorporare dal compilatore? Mi piacerebbe che il lambda passato fosse il più "inelegabile" possibile.

+1

Cos'è un lambda mutabile? –

+0

mutable \t - \t consente al corpo di modificare i parametri acquisiti dalla copia e di chiamare le loro funzioni membro non const – user1095108

+0

Oh, c'è una parola chiave per questo. Dimenticato. –

risposta

2

pensare ad un lambda come un piccolo oggetto con un operatore funzione di chiamata:

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

è in qualche modo equivalente a:

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

Quindi, vedete, il corpo della funzione stessa può essere inline se è visto nella stessa unità di traduzione come viene chiamata (e forse se non da alcuni compilatori più intelligenti). Dato che il tuo invoke è un modello, conosce il tipo effettivo di lamdba e non lo imponi di saltare attraverso i cerchi di puntatore di funzioni, che è un grande inibitore dell'inallineamento.

Prendendo l'oggetto richiamabile per valore o riferimento in invoke determina se le variabili acquisite sono locali al corpo della funzione o no, che può fare la differenza se questo significa che sarà nella cache.

+0

La copia è migliore per la cache, suppongo? – user1095108

+0

Questo è quello che ho sentito. Non ho eseguito i miei numeri. – BoBTFish