Tại sao trong mã ví dụ bên dưới, đối tượng được sao chép hai lần? Theo constructor tài liệu của lớp thread sao chép tất cả các đối số để lưu trữ thread-local để chúng ta có lý do cho bản sao đầu tiên. Điều gì về thứ hai?std :: thread Tại sao đối tượng được sao chép hai lần?
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();
}
Output từ trên cao:
[C]
[COPY]
[COPY]
[~D]
#
[~D]
[~D]
Edit: Vâng vâng, sau khi thêm động thái constructor:
A(A && src) {cout << "[MOVE]" << endl;}
Đầu ra là như thế này:
[C]
[COPY]
[MOVE]
[~D]
#
[~D]
[~D]
Chỉ cần sửa một chút: các đối số không được sao chép vào bộ nhớ ** ** cục bộ **, nhưng vào ngăn xếp của chuỗi mới. Thread-local storage là một động vật hoàn toàn khác; biến chủ đề cục bộ, về bản chất, một biến toàn cục cho mỗi luồng, có thể truy cập từ bất kỳ hàm nào trong luồng, với một bản sao riêng biệt trong mỗi luồng. –
Trong thực tế, thứ hai '[COPY]' là '[MOVE]', nhưng bạn không thể nhìn thấy nó bởi vì bạn không có hàm khởi tạo nào được triển khai. – soon
Trong trường hợp trên, [COPY] thứ hai là bản sao. Chỉ khi bạn cung cấp một nhà xây dựng di chuyển hoặc khai báo nó rõ ràng với = mặc định bạn sẽ có được di chuyển. – Klaus