2015-10-30 16 views
6

Czy jest jakiś narzut w korzystaniu z domyślnego trybu przechwytywania?Zamknięcie domyślnego obciążenia przechwytywania

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

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

Aby wyjaśnić, czy są jakieś koszty związane z wykorzystaniem pierwszego z nich, nawet jeśli nie są używane?

+4

Kiedy mówisz "koszt", co przez to rozumiesz? Przechowywanie? Czas egzekucji? Czas kompilacji? Coś innego? –

+0

@JoachimPileborg Mam na myśli, jeśli istnieje jakikolwiek koszt w czasie wykonywania, jak więcej pamięci w pierwszym przypadku –

+3

Nie ma żadnych kosztów. Tylko zmienne, które faktycznie * używasz * są przechwytywane w pierwszym przypadku. – jalf

Odpowiedz

3

Nie jest określone, w jaki sposób oferty lambda z podmiotami przechwyconych przez odniesienie, od projektu standard C++ 14 odcinek (N4140) 5.1.2 [expr.prim.lambda]:

Jednostka jest przechwycone przez odniesienie, jeśli jest to domyślnie lub wyraźnie przechwycone, ale nie przechwycone przez kopię. Nie jest określone, czy dodatkowe nienamagowane elementy danych nie są określone w typie zamknięcia dla obiektów przechwyconych przez odniesienie. Członek anonimowego unii nie zostaną przechwycone przez odniesienie

Sformułowanie to zostało celowo lewej otwarte, aby umożliwić implementacje w celu optymalizacji obejść ten problem, zobacz defect report 750: Implementation constraints on reference-only closure objects który odwołuje N2927 który mówi:

Nowe sformułowanie nie określa już żadnych elementów do przepisywania lub zamykania dla przechwycenia "przez odniesienie" dla . Zastosowania podmiotów przechwyconych "przez odniesienie" wpływają na oryginalne jednostki, a mechanizm do osiągnięcia tego jest całkowicie pozostawiony do realizacji.

2

N3337 5.1.2/15 lub N4527 (C++ 14 końcowy projekt) 5.1.2/16

Podmiot jest wychwytywana jako odnośnik, jeśli jest pośrednio lub bezpośrednio zarejestrowany, ale nie zdobyty przez kopię . Nie jest określone, czy nienazwane nie statyczne elementy danych są zadeklarowane w typie zamknięcia dla jednostek przechwyconych przez odniesienie.

+1

Notatka 'N3337' jest szkicem najbliższym C++ 11, natomiast' N4140' jest szkicem najbliższym C++ 14, z którym OP otagowało pytanie. Z mojej odpowiedzi wynika, że ​​cytat 'N4140' jest inny, chociaż różnica nie wpływa na to pytanie. W wielu przypadkach odpowiedź jest inna w przypadku C++ 11 vs C++ 14. Podczas gdy 'N4527' będzie najnowszą roboczą wersją roboczą, która obecnie jest dostępna, jest to w zasadzie C++ 1z. –