23

boost::lock_guardステートメント内のロック(または同様のスコープロック)の使用と、ロックによって保護されるべき変数の使用について質問がありますreturn

ローカルオブジェクトを破棄して戻り値をコピーする順序はどうですか?戻り値の最適化はこれにどのように影響しますか?

例:

Data Class::GetData()
{
    boost::lock_guard<boost::mutex> lock(this->mMutex);
    return this->mData;
}

これは正しいでしょうか(mDataがmMutexによって保護されている変数である場合)?または、以下の例に示すように、ローカルスコープと一時的なスコープを使用する必要がありますか?

Data Class::GetData()
{
    Data ret;
    {
        boost::lock_guard<boost::mutex> lock(this->mMutex);
        ret = this->mData;
    }
    return ret;
}
4

3 に答える 3

29

最初の例のように、まっすぐに戻るだけで正しいです。戻り値は、ローカル変数が破棄される前、つまりロックが解放される前に作成されます。

于 2010-10-04T15:38:09.103 に答える
3

ローカルオブジェクトを破棄して戻り値をコピーする順序はどうですか?

通常、スタックオブジェクトは作成の逆の順序で破棄されます。前に述べたように、指定する両方のアプローチが望ましい動作を提供します。

戻り値の最適化はこれにどのように影響しますか?

ここでは、RVOを気にする必要はありません。これは、出力オブジェクトをスタックフレームバッファーに直接構築することだけです。名前付きの一時オブジェクトを作成するオーバーヘッドを回避します(上記の2番目の例のように)。これは、ローカルデストラクタが呼び出される前に実行されます。

上記の例1のコードを使用するのが最善です。

于 2010-10-04T16:09:35.940 に答える
0

両方の部分は同等です。実際、ケース#1の場合-C ++コンパイラは、ケース#2で説明した構造を作成します。したがって、#1が望ましいです。

于 2010-10-04T15:41:42.673 に答える