2013-10-09 15 views
8

Bạn có thể đưa ra một ví dụ tầm thường hoặc thực tế để chứng minh việc sử dụng hàm tạo bản sao dễ bay hơi không?Trình tạo bản sao dễ bay hơi là gì?

Tôi không thể nghĩ ra được.

+6

Khi bạn có các đối tượng dễ bay hơi, bạn cần bản sao dễ bay hơi-ctor. Vì vậy, câu hỏi sôi xuống này: khi nào bạn cần các đối tượng dễ bay hơi? – Nawaz

Trả lời

8

như @Nawaz đã chỉ ra:

Khi bạn có các đối tượng không ổn định, bạn cần biến động sao chép ctor. Vì vậy, câu hỏi sôi xuống này: khi nào bạn cần các đối tượng dễ bay hơi?

Lý do chính để sử dụng từ khóa dễ bay hơi thường là tắt tối ưu hóa. Đó là nếu bạn có một cái gì đó như thế này:

bool flag = false; 
if(!flag) {} 

Trình biên dịch sẽ không thể thay đổi cờ vì vậy không cần kiểm tra cờ mỗi lần - vì vậy sẽ không được. Nhưng nếu bạn làm biến cờ biến động - nó sẽ.

Dưới đây là một ý kiến ​​của biến động sử dụng gốc từ khóa: link

Nói tóm lại, ban đầu nó được sử dụng để truy cập vào phần cứng qua MMIO, mà có thể hơi khác thường:

unsigned char* pControl = 0xff24 ; 
*pControl = 0 ; 
*pControl = 0 ; 
*pControl = 0 ; 

Và bạn không muốn 3 bài tập đó trở thành một do tối ưu hóa.

Và đây là một bài báo của Andrei Alexandrescu trên dễ bay hơi trong phần mềm đa luồng: link

Đã có một số giấy tờ trích giấy Alexandrescu, nhưng tôi không thể tìm thấy nó. Vấn đề là anh ta đã bỏ đi bất động sản dễ bay hơi và vân vân.

Hãy nhận biết điều rất quan trọng về đa luồng, chỉ ra bởi @JanHudec:

volatile là hoàn toàn vô dụng đối với bối cảnh đa luồng, vì trong khi nó ngăn cản tối ưu hóa, nó không tạo ra các rào cản rõ ràng. Và nếu không có những ghi được thực hiện trên một CPU có thể không hiển thị với một CPU khác (phụ thuộc vào kiến ​​trúc; x86 có bộ nhớ cache mạch lạc, vì vậy việc ghi luôn luôn hiển thị ở đó).

Ngoài ra volatile không bắt buộc hoạt động là nguyên tử. Về phân công x86 luôn luôn là nguyên tử, nhưng nó không phải là trường hợp với tất cả các kiến ​​trúc CPU. Và các hoạt động phức tạp hơn như gia tăng chỉ có thể được thực hiện bằng cách sử dụng nguyên tử std::atomic.

+0

Ý kiến ​​không khả dụng, hãy thử sử dụng một liên kết cố định hợp lệ. – Zeta

+0

@Zeta - cảm ơn. URL đã bị rối tung lên bằng cách nào đó; đã chỉnh sửa. –

+3

'volatile' là hoàn toàn vô dụng đối với bối cảnh đa luồng, bởi vì trong khi nó ngăn chặn tối ưu hóa, nó không tạo ra các rào cản rõ ràng. Và nếu không có những ghi được thực hiện trên một CPU có thể không hiển thị với một CPU khác (phụ thuộc vào kiến ​​trúc; x86 có bộ nhớ cache mạch lạc, vì vậy việc ghi luôn luôn hiển thị ở đó). –

Các vấn đề liên quan