7

以下两个函数产生不同的程序集,这告诉我它们是不同的。有人能告诉我他们有什么不同吗?func2中的函数局部静态变量初始化是否线程安全?如果答案取决于编译器,我想知道最常见的编译器如何处理 func2。

int func1(int val)
{
    const auto impl = [](int v)
    {
        return v * 10;
    };

    return impl(val);
}

int func2(int val)
{
    static const auto impl = [](int v)
    {
        return v * 10;
    };

    return impl(val);
}
4

2 回答 2

8

“最常见的编译器”可能对此有所不同,因为它们对 C++11 的支持并不完全相同。

在 C++11 中,静态变量的初始化是线程安全的。在 C++03 中它不是(因为根据标准没有任何线程)。

于 2012-08-13T17:48:54.930 回答
4

As Bo says, the current C++ standard demands that static variable initialization not introduce a data race. (This is of course only relevant to the dynamic initialization phase.) For example, if you look at the output of GCC when initializing a static variable, you'll indeed find calls to __cxa_guard_acquire, __cxa_guard_release and __cxa_guard_abort surrounding the initialization.

The Itanium C++ ABI actually formalizes the mechanism.

于 2012-08-13T17:59:46.480 回答