Từ documentation:Liệu MS-cụ thể biến động ngăn chặn các hướng dẫn phần cứng sắp xếp lại
Microsoft Cụ
Khi/ổn định: ms biên dịch tùy chọn được sử dụng theo mặc định khi kiến trúc khác so với ARM là được nhắm mục tiêu — trình biên dịch tạo thêm mã để duy trì thứ tự trong số các tham chiếu đến các đối tượng dễ bay hơi trong ngoài việc duy trì thứ tự tham chiếu đến các đối tượng toàn cầu khác .Đặc biệt:
- Ghi vào một đối tượng dễ bay hơi (còn được gọi là viết dễ bay hơi) đã phát hành ngữ nghĩa; có nghĩa là, một tham chiếu đến một đối tượng toàn cục hoặc tĩnh
xảy ra trước khi ghi vào một đối tượng dễ bay hơi trong lệnh
trình tự sẽ xảy ra trước khi ghi dễ bay hơi trong biên dịch nhị phân
.- Đọc của một đối tượng dễ bay hơi (còn được gọi là đọc dễ bay hơi) có được ngữ nghĩa; có nghĩa là, một tham chiếu đến một đối tượng toàn cầu hoặc tĩnh
xảy ra sau khi đọc bộ nhớ dễ bay hơi trong lệnh
trình tự sẽ xảy ra sau khi đọc dễ bay hơi trong nhị phân đã biên dịch.Điều này cho phép các đối tượng dễ bay hơi được sử dụng cho các khóa bộ nhớ và phát hành trong các ứng dụng đa luồng.
Nó chắc chắn đảm bảo rằng volatile
ngăn biên dịch từ làm hướng dẫn thời gian biên dịch sắp xếp lại (vì nó rõ ràng khẳng định rằng trình tự hướng dẫn sẽ giống nhau trong biên soạn nhị phân).
Nhưng như chúng ta đều biết, cũng có những thứ như sắp xếp lại phần cứng (như CPU có thể sắp xếp lại các chỉ dẫn theo ý muốn của riêng họ). volatile
có ngăn chặn nó không? Tôi biết rằng đồng bộ hóa nguyên thủy (như mutexes) làm, nhưng những gì về MS cụ thể volatile
?
Bởi "kiến trúc khác ngoài ARM", MS có thể là x86 và x64. Trên x86 và x64, các tải không được sắp xếp lại với các tải khác. Và các cửa hàng không được đặt hàng với các cửa hàng khác. (với một số ngoại lệ như các cửa hàng phi thời gian) IOW, miễn là trình biên dịch không sắp xếp lại bất cứ thứ gì, cũng không phải bộ xử lý. Có vẻ như '/ volatile' cho MS đang cố gắng cung cấp chức năng của' std :: atomic' không tồn tại cho đến C++ 11. – Mysticial
Hơn nữa, họ nói "đã phát hành ngữ nghĩa", vì vậy tài liệu chắc chắn * tuyên bố * 'dễ bay hơi 'ngăn CPU sắp xếp lại. –
@Mysticial "Có vẻ như/volatile cho MS đang cố gắng cung cấp các chức năng của std :: atomic" - không, nó không. Ví dụ, nó không đảm bảo rằng các hoạt động đọc và ghi đối với các biến 'volatile' là nguyên tử. Trong thực tế, chúng - bởi vì x86 đảm bảo nguyên tử của các hoạt động đọc và ghi cho các biến 1 byte, nhưng nó không được bảo đảm trong MSDN bởi 'volatile' – FrozenHeart