2015-10-30 10 views
6

C'è un sovraccarico nell'utilizzo di una modalità di acquisizione predefinita?Overhead capture overhead di chiusura

{ 
    Foo foo = ...; 
    Bar bar = ...; 
    [&]() 
    { 
     write(foo); 
    } 
} 

{ 
    Foo foo = ...; 
    Bar bar = ...; 
    [&foo]() 
    { 
     write(foo); 
    } 
} 

Per chiarire c'è qualche costo nell'usare il primo relativo alla cattura della barra anche se non utilizzato?

+4

Quando si dice "costo", cosa intendi con questo? Conservazione? Tempo di esecuzione? Tempo di compilazione? Qualcos'altro? –

+0

@JoachimPileborg Voglio dire se c'è un costo di runtime come maggiore spazio di archiviazione nel primo caso –

+3

Non ci sono costi. Solo le variabili che effettivamente * usi * vengono catturate nel primo caso. – jalf

risposta

3

E non è specificato come le offerte lambda con i soggetti catturati con riferimento, dal progetto (N4140) sezione C++ 14 di serie 5.1.2 [expr.prim.lambda]:

Un'entità è catturato per riferimento se è implicitamente o esplicitamente catturato ma non catturato dalla copia. Non è specificato se i membri di dati non statici non nominati sono dichiarati nel tipo di chiusura per le entità acquisite per riferimento. Un membro di un anonimo dell'Unione non possono essere catturati con riferimento

Questa formulazione è stata volutamente lasciata aperta per permettere implementazioni di ottimizzare intorno a questo, vedere defect report 750: Implementation constraints on reference-only closure objects che fa riferimento N2927 che dice:

La nuova formulazione non specifica più alcun membro di riscrittura o di chiusura per l'acquisizione "per riferimento" . Gli utilizzi di entità catturate "per riferimento" riguardano le entità originali e il meccanismo per ottenere ciò è lasciato interamente all'implementazione.

2

N3337 5.1.2/15 o N4527 (C++ 14 bozza finale) 5.1.2/16

Un'entità viene catturato da riferimento se è implicitamente o esplicitamente catturato ma non catturati copiando . Non è specificato se i membri di dati non statici non nominati sono dichiarati nel tipo di chiusura per le entità acquisite per riferimento.

+1

Nota 'N3337' è la bozza più vicina a C++ 11 mentre' N4140' è la bozza più vicina a C++ 14 che è ciò che l'OP ha etichettato con la domanda. Possiamo vedere dalla mia risposta che la citazione 'N4140' è diversa, sebbene la differenza non influenzi questa domanda. Ci sono molti casi in cui la risposta è diversa per C++ 11 vs C++ 14. Mentre 'N4527' sarebbe l'ultima bozza attualmente disponibile è fondamentalmente C++ 1z. –