2011-09-21 32 views
8

Tài liệu MSDN cho "dễ bay hơi" trong Visual C++ chỉ ra rằng các ghi có "ngữ nghĩa phát hành" và đọc có "ngữ nghĩa học", ngoài việc đảm bảo đọc luôn đọc từ bộ nhớ và ghi luôn viết cho phù hợp.Visual C++ Volatile

Thông số C cho "dễ bay hơi" bao gồm phần thứ hai (không làm tối ưu hóa điên), nhưng không phải là phần đầu tiên (hàng rào bộ nhớ).

Có cách nào trong Visual C++ chỉ nhận hành vi biến động "C" mà không có hàng rào bộ nhớ không?

Tôi muốn buộc biến luôn ở trên ngăn xếp, ở vị trí cố định, nhưng tôi không muốn lấy chi phí của hàng rào bộ nhớ trên mọi nhiệm vụ cho nó.

Có cách nào dễ dàng để thực hiện điều đó bằng nguồn Visual C++ không?

+0

Phần đầu tiên không phải là hành vi Standard C++, tôi nghĩ vậy. Tôi không chắc chắn, mặc dù. – Nawaz

+0

"Tôi muốn buộc một biến luôn ở trên ngăn xếp, ở một vị trí cố định" và làm thế nào 'biến động' sẽ giúp với điều đó? FWIW, các biến là * luôn luôn * ở một vị trí cố định. @ Nawaz: không, phần đầu tiên không phải là tiêu chuẩn. –

+1

@Fernades Biến cục bộ KHÔNG phải lúc nào cũng ở vị trí cố định. Các biến cục bộ có thể được loại bỏ hoặc địa chỉ của chúng trên ngăn xếp có thể ở các vị trí khác nhau tùy thuộc vào vị trí của PC. Trình tối ưu hóa có thể thực hiện rất nhiều thứ điên rồ. Tôi muốn ngăn chặn những tối ưu hóa đó. Cách để làm điều đó là sử dụng "dễ bay hơi". Tuy nhiên, tôi không muốn hàng rào bộ nhớ không bắt buộc mà Visual C++ ném vào. –

Trả lời

4

Có cách nào trong Visual C++ chỉ nhận hành vi biến động "C" mà không có hàng rào bộ nhớ không?

Trên x86 không có hàng rào bộ nhớ được tạo ở cấp độ lắp ráp khi đọc và ghi vào vị trí bộ nhớ volatile từ mỗi nền tảng đó, và mỗi cửa hàng đều có ngữ nghĩa phát hành. Do đó đối với MSVC trên x86, chỉ thị volatile đơn giản chỉ đạo trình biên dịch để ngăn việc sắp xếp lại các tải và lưu trữ tùy thuộc vào việc bạn đang viết hoặc đọc từ vị trí bộ nhớ đã được đánh dấu volatile.

Bạn sẽ chỉ phải chịu "hình phạt" của hàng rào bộ nhớ trên kiến ​​trúc IA64, vì mô hình đặt hàng bộ nhớ của nền tảng không đảm bảo có được và phát hành ngữ nghĩa cho tải và lưu trữ.

Hãy nhớ rằng hành vi này là đặc thù của MSVC và không phải là ngữ nghĩa chuẩn hóa của volatile.

Cập nhật: Theo @ildjarn bạn cũng sẽ thấy hàng rào bộ nhớ trên ARM với Windows 8 vì nền tảng đó cũng có mô hình bộ nhớ nhất quán yếu như IA64.

+0

Hình phạt cũng áp dụng cho ARM. – ildjarn

+0

MSVC có hoạt động trên ARM không? ... Tôi không biết bạn có thể chạy các chương trình Windows trên ARM ... – Jason

+0

ARM là nền tảng chính cho Windows 8, vì vậy MSVC11 cũng hỗ trợ ARM làm kiến ​​trúc chính. – ildjarn