以下のサンプルコードでは、オブジェクトが2回コピーされるのはなぜですか?スレッドクラスのドキュメントコンストラクタによれば、すべての引数をスレッドローカルストレージにコピーするので、最初のコピーの理由があります。秒はどう?上記からstd :: threadなぜオブジェクトが2回コピーされるのですか?
class A {
public:
A() {cout << "[C]" << endl;}
~A() {cout << "[~D]" << endl;}
A(A const& src) {cout << "[COPY]" << endl;}
A& operator=(A const& src) {cout << "[=}" << endl; return *this;}
void operator()() {cout << "#" << endl;}
};
void foo()
{
A a;
thread t{a};
t.join();
}
出力:
[C]
[COPY]
[COPY]
[~D]
#
[~D]
[~D]
編集: まあはい、移動のコンストラクタを追加した後:
A(A && src) {cout << "[MOVE]" << endl;}
出力は次のようなものです:
[C]
[COPY]
[MOVE]
[~D]
#
[~D]
[~D]
ちょっとした修正:引数は**スレッドローカル**ストレージにコピーされず、新しいスレッドのスタックにコピーされます。スレッドローカルストレージはまったく別の動物です。スレッドローカル変数は、本質的に、スレッド内の任意の関数からアクセス可能なスレッド単位のグローバル変数であり、各スレッド内に個別のコピーがあります。 –
実際、2番目の[COPY]は '[MOVE]'ですが、移動コンストラクタが実装されていないため表示できません。 – soon
上記の場合、2番目の[COPY]はコピーです。移動コンストラクタを提供するか、または= defaultを指定して明示的に宣言した場合にのみ、移動が行われます。 – Klaus