関数呼び出しパラメーターがどのようにインターリーブされるかについて正確に指定されていることを完全に理解したいと思います。私には多くの意味があるように思えます。次の例を見てください。
void mad(cow_string a, cow_string b);
cow_string s("moo");
cow_string s1 = s;
cow_string s2 = s;
mad(s1+="haha",s2+="hahaha");
Sutterがcow_string
GotW で説明しているような Copy-On-Write 文字列コンテナーはどこにありますか: http://www.gotw.ca/gotw/045.htm
s1+="haha"
との評価がs2+="hahaha"
非常に細かい粒度にインターリーブされている場合、これは (コンパイラに応じて) cow_strings 内部参照カウントで競合状態が発生していることを意味しませんか?ミューテックスを使用して競合状態から保護しようとすると、シングルスレッドプログラムでセルフロックが発生することさえありませんでした (頭が痛くなります)。たとえば、S1 は内部コピーを作成し、mutex を取得して ref カウントコンテキスト スイッチを減らします。S2 も内部コピーを作成し、mutex と bam セルフ ロックを実行します。
(最初が true の場合のみ) 私のチームの他のメンバーが専門家でない場合、またはそのオブジェクトが COW であることを知らない場合、オブジェクトを COW にする安全な方法はありますか?
編集:
明確にするために、式があまりインターリーブされていないという私の図は、次の Herb Sutters の例によって揺さぶられました。
// In some header file:
void f( T1*, T2* );
// In some implementation file:
f( new T1, new T2 );
これを行う:
allocate memory for the T1
construct the T1
allocate memory for the T2
construct the T2
call f()
またはこれ:
allocate memory for the T1
allocate memory for the T2
construct the T1
construct the T2
call f()
ここでそれについて読んでください:http://flylib.com/books/en/3.259.1.55/1/
cow_string
2 番目の編集:参照カウンターを変更する関数がインライン化されると想定していたと思いますが、これはばかげた想定です。そのばかげた仮定がなければ、私の質問はあまり意味がありません。答えてくれてありがとう!