7

次の 2 つの関数は異なるアセンブリを生成します。これは、それらが異なることを示しています。誰かが私に彼らがどのように違うのか教えてもらえますか? また、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

Bo が言うように、現在の C++ 標準では、静的変数の初期化によってデータ競合が発生しないことが要求されています。(もちろん、これは動的初期化フェーズにのみ関連します。)たとえば、静的変数を初期化するときに GCC の出力を見ると、初期化を囲む ,__cxa_guard_acquireへの呼び出しが実際に見つかります。__cxa_guard_release__cxa_guard_abort

Itanium C++ ABIは実際にメカニズムを形式化します。

于 2012-08-13T17:59:46.480 に答える