2017-06-10 53 views
5

我偶然發現了這個代碼是用C++拉姆達:C++靜態拉姆達性能

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

爲什麼要使用lambda對這樣的人寫這樣的功能:

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

有什麼表現優點?我只是想了解lambda在這種情況下的用處。

+3

你是否知道他們做了不同的事情? – juanchopanza

+1

提示:檢查「qreal」究竟是什麼。免費線索:不,它不是'雙'。 –

+0

@SamVarshavchik雖然聽起來像[它幾乎總是](http://doc.qt.io/qt-4.8/qtglobal.html#qreal-typedef)'double'。但這是一個暗示? – Quentin

回答

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

scale靜態局部變量。因此,它的初始化表達式只執行一次。由於初始化有點複雜,作者使用直接調用的lambda來獲得更多的自由(如聲明變量)。

命名函數可能是替代方法,但爲此您需要一個描述性名稱(initDefaultDpiScale?),它會污染命名空間,有更多的代碼可以寫入,然後甚至不在一個地方,但分散在兩個函數中。

每次調用函數時,您的代碼都會執行if和(最多)3個函數調用。取決於這些功能的複雜程度,這可能會對性能產生巨大影響。此外,如果其中一個函數有副作用,那麼你的代碼甚至會改變函數的行爲(對代碼的其餘部分可見)。

最後注意一下代碼帶來的不同意圖:scale取決於可能變化的運行時環境。原始代碼表示scale取決於運行時環境,但可以視爲程序整個運行時的常量。