2017-06-10 3 views
5

stolperte ich über diesen Code, C++ Lambda verwendet:C++ statische Lambda Performance

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

Warum gegen so etwas wie dies mit dieser Funktion Lambda jemand schreiben würde:

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

Gibt es eine Performance Vorteil? Ich versuche nur in diesem Zusammenhang die Nützlichkeit von Lambda zu verstehen.

+3

Sind Sie sich bewusst, dass sie verschiedene Dinge tun? – juanchopanza

+1

Hinweis: Untersuchen Sie, was 'qreal' wirklich ist. Freier Hinweis: Nein, es ist kein "Double". –

+0

@SamVarshavchik klingt wie es [ist fast immer] (http://doc.qt.io/qt-4.8/qtglobal.html#qreal-typedef) ein 'doppeltes' obwohl. Aber wie ist das ein Hinweis? – Quentin

Antwort

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

scale ist ein statische lokale Variable. Daher wird sein Initialisierungsausdruck nur einmal ausgeführt. Da die Initialisierung etwas komplexer ist, verwendet der Autor ein direktes Lambda, um mehr Freiheit zu haben (wie Variablen deklarieren).

Eine benannte Funktion wäre die Alternative gewesen, aber dafür benötigen Sie einen aussagekräftigen Namen (initDefaultDpiScale?), Der den Namensraum verschmutzt, mehr Code zum Schreiben hat, der dann nicht an einer Stelle, sondern über zwei Funktionen verstreut ist.

Ihr Code führt bei jedem Aufruf der Funktion einen if und (bis zu) 3 Funktionsaufrufe aus. Je nachdem, wie komplex diese Funktionen sind, kann dies enorme Auswirkungen auf die Performance haben. Wenn eine der Funktionen einen Nebeneffekt hat, ändert Ihr Code sogar das Verhalten der Funktion (wie für den Rest des Codes sichtbar).

Beachten Sie schließlich die unterschiedliche Absicht, die von Ihrem Code übernommen wird: Die scale ist etwas, das von einer möglicherweise unterschiedlichen Laufzeitumgebung abhängt. Der ursprüngliche Code gibt stattdessen an, dass scale von der Laufzeitumgebung abhängt, aber für die gesamte Laufzeit des Programms als konstant betrachtet werden kann.