c ++静态lambda性能

fm_*_*cpp 6 c++ performance lambda

我偶然发现了使用c ++ lambda的代码:

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

为什么有人会使用lambda写这个函数而不是这样:

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

有任何性能优势吗?我只是想在这种情况下理解lambda的用处.

Dan*_*our 3

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

scale静态局部变量。因此,其初始化表达式仅执行一次。由于初始化稍微复杂一些,作者使用了直接调用的lambda,以便有更多的自由度(如声明变量)。

命名函数本来是另一种选择,但为此您需要一个描述性名称(initDefaultDpiScale?),它会污染命名空间,需要编写更多代码,这些代码甚至不在一个地方,而是分散在两个函数中。

每次调用函数时,您的代码都会执行 1 次if和(最多)3 次函数调用。根据这些功能的复杂程度,这可能会对性能产生巨大影响。此外,如果其中一个函数有副作用,那么您的代码甚至会更改该函数的行为(对其余代码可见)。

最后请注意代码所传达的不同意图:这scale取决于可能变化的运行时环境。相反,原始代码指出这scale取决于运行时环境,但可以认为在程序的整个运行时是恒定的。