2017-06-10 27 views
5

natknąłem się na ten kod, który jest przy użyciu C++ lambda:C++ statyczne wydajność lambda

qreal defaultDpiScale() 
{ 
    static qreal scale = []() { 
     if (const QScreen *screen = QGuiApplication::primaryScreen()) 
      return screen->logicalDotsPerInchX()/96.0; 
     return 1.0; 
    }(); 
    return scale; 
} 

Dlaczego ktoś miałby napisać tę funkcję za pomocą lambda vs coś takiego:

qreal defaultDpiScale() 
{ 
    if (const QScreen *screen = QGuiApplication::primaryScreen()) 
     return screen->logicalDotsPerInchX()/96.0; 
    else 
     return 1.0; 
} 

Czy istnieje wydajność korzyść? Po prostu próbuję zrozumieć użyteczność lambda w tym kontekście.

+3

Czy zdajesz sobie sprawę, że robią różne rzeczy? – juanchopanza

+1

Wskazówka: sprawdź, czym naprawdę jest "qreal". Darmowa wskazówka: nie, to nie jest "podwójne". –

+0

@SamVarshavchik brzmi jak to [jest prawie zawsze] (http://doc.qt.io/qt-4.8/qtglobal.html#qreal-typedef) a 'double' though. Ale jak to jest wskazówka? – Quentin

Odpowiedz

2
qreal defaultDpiScale() 
{ 
// vvvv 
    static qreal scale = []() { 
     if (const QScreen *screen = QGuiApplication::primaryScreen()) 
      return screen->logicalDotsPerInchX()/96.0; 
     return 1.0; 
    }(); 
    return scale; 
} 

scale jest zmienna lokalna statyczny. Jako takie jego wyrażenie inicjalizacyjne jest wykonywane tylko raz. Ponieważ inicjalizacja jest nieco bardziej złożona, autor używa bezpośrednio zwanej lambdy, aby mieć więcej swobody (jak deklarowanie zmiennych).

Nazwana funkcja byłaby alternatywą, ale do tego potrzebna jest opisowa nazwa (initDefaultDpiScale?), Która zanieczyszcza przestrzeń nazw, ma więcej kodu do napisania, który nie jest nawet w jednym miejscu, ale jest rozproszony na dwie funkcje.

Twój kod wykonuje wywołania funkcji if i (maksymalnie) 3 za każdym razem, gdy wywoływana jest funkcja. W zależności od tego, jak złożone są te funkcje, może to mieć ogromny wpływ na wydajność. Ponadto, jeśli jedna z funkcji ma efekt uboczny, twój kod zmienia nawet zachowanie funkcji (widoczne dla reszty kodu).

Na koniec zwróć uwagę na różne intencje, które są przenoszone przez twój kod: scale jest czymś, co zależy od potencjalnie zmiennego środowiska uruchomieniowego. Oryginalny kod oznacza, że ​​scale zależy od środowiska wykonawczego, ale można go uznać za stały dla całego środowiska wykonawczego programu.