Tôi đoán "Thiếu mô hình bộ nhớ" trong các trường hợp này chỉ có nghĩa là trình tối ưu hóa được viết trước khi mô hình bộ nhớ C++ 11 được xuất bản và có thể thực hiện tối ưu hóa không hợp lệ. Rất khó khăn và tốn thời gian để xác thực tối ưu hóa mô hình bộ nhớ, do đó, không có gì ngạc nhiên khi các đội clang/gcc chưa hoàn thành.
Việc thiếu hỗ trợ mô hình bộ nhớ có nghĩa là các chương trình C++ 11 hợp pháp sử dụng std :: seent arent seq nhất quán không?
Vâng, đó là một khả năng. Nó thậm chí còn tồi tệ hơn: trình biên dịch có thể giới thiệu các cuộc đua dữ liệu vào (theo tiêu chuẩn C++ 11) các chương trình không có chủng tộc, ví dụ: bằng cách giới thiệu đầu cơ viết.
Ví dụ, một số trình biên dịch C++ sử dụng để thực hiện tối ưu hóa này:
for (p = q; p = p -> next; ++p) {
if (p -> data > 0) ++count;
}
thể được tối ưu hóa thành:
register int r1 = count;
for (p = q; p = p -> next; ++p) {
if (p -> data > 0) ++r1;
}
count = r1;
Nếu tất cả p->data
là không âm, mã nguồn gốc không viết đến count
, nhưng mã được tối ưu hóa. Điều này có thể giới thiệu một cuộc đua dữ liệu trong một chương trình không có chủng tộc khác, vì vậy đặc tả C++ 11 không cho phép tối ưu hóa như vậy. Các trình biên dịch hiện tại phải xác minh (và điều chỉnh nếu cần thiết) tất cả các tối ưu hóa.
Xem Concurrency memory model compiler consequences để biết chi tiết.
Tính nguyên tử là một trong (ba?) Thuộc tính của mô hình bộ nhớ, cùng với khả năng hiển thị bộ nhớ và thứ tự bộ nhớ. Nguyên tử không phải là một 'từ đồng nghĩa' của mô hình bộ nhớ. – mloskot