2013-04-28 36 views
23

Tôi đang tự hỏi về những ứng dụng khác nhau của dễ bay hơi từ khóa kết hợp với đăng ký, consttĩnh từ khóa. Tôi không chắc chắn những tác động là gì, vì vậy tôi nghĩ rằng:const biến động, đăng ký biến động, tĩnh dễ bay hơi trong C++

register volatile int T=10; 

Suggest trình biên dịch để lưu trữ T trong một thanh ghi và giá trị của T có thể được sửa đổi từ một nơi nào bên ngoài (hệ điều hành, phần cứng, thread khác)

const volatile int T=10; 

Bản thân chương trình không thể sửa đổi T, nhưng T có thể được sửa đổi ở một nơi nào đó bên ngoài mã.

static volatile int T=10; 

Nếu T là thành viên dữ liệu của lớp, nghĩa là tất cả các đối tượng của lớp có cùng giá trị cho T và T có thể được sửa đổi từ đâu đó bên ngoài. Nếu T là một biến toàn cầu trong một tệp, mã nguồn trong các tệp khác (là một phần của dự án) không thể truy cập T, nhưng T có thể được truy cập từ một nơi nào đó bên ngoài. Nếu T là một biến cục bộ trong một hàm, một khi nó đã được khởi tạo vẫn còn trong bộ nhớ cho đến khi kết thúc chương trình và có thể được sửa đổi từ một nơi nào đó bên ngoài.

Suy nghĩ của tôi có đúng không và bất kỳ nhà phát triển C++ nào có kinh nghiệm đưa ra ví dụ ở trên có thể được sử dụng trong các ứng dụng trong thế giới thực hay rất hiếm?

+0

Rất đẹp! +1. Thậm chí có thể bao gồm 'mutable'. –

Trả lời

26
register volatile int T=10; 

volatile vòng có nghĩa là trình biên dịch không thể áp dụng tối ưu hóa hoặc sắp xếp lại quyền truy cập vào T, khi register là một gợi ý để trình biên dịch rằng T sẽ được sử dụng rất nhiều. Nếu địa chỉ của T được thực hiện, gợi ý chỉ đơn giản là bị bỏ qua bởi trình biên dịch. Lưu ý rằng register không được dùng nữa nhưng vẫn được sử dụng.

Cách sử dụng thực tế:

Tôi chưa bao giờ sử dụng nó chưa bao giờ cảm thấy cần thiết và không thể thực sự nghĩ ra bất kỳ điều gì ngay bây giờ.


const volatile int T=10; 

const vòng có nghĩa là T không thể được sửa đổi thông qua mã. Nếu bạn cố gắng làm như vậy trình biên dịch sẽ cung cấp một chẩn đoán. volatile vẫn có nghĩa là giống như trong trường hợp 1. Trình biên dịch không thể tối ưu hóa hoặc sắp xếp lại quyền truy cập vào T.

Cách sử dụng thực tế:

  • Truy cập bộ nhớ chia sẻ trong chế độ read-only.
  • Truy cập thanh ghi phần cứng ở chế độ chỉ đọc.

static volatile int T=10; 

static lưu trữ vòng loại cho T thời gian lưu trữ tĩnh (C++ 11 §3.7) và internal linkage, trong khi volatile vẫn chỉnh việc tối ưu hóa và sắp xếp lại.

Cách sử dụng thực tế:

  • Tương tự như volatile ngoại trừ việc bạn cần đối tượng để có thời gian lưu trữ tĩnh và không thể tiếp cận từ các đơn vị dịch khác.
+2

Đối với phần thứ hai, bạn có chắc chắn rằng bạn đang nói về các đối tượng * biến động *, hoặc tham chiếu const-volatile * (hoặc con trỏ tới các đối tượng biến động)? Bởi vì nó không có vẻ giống như một đối tượng const-volatile có thể ánh xạ tới phần cứng ... – Mehrdad

+1

@Mehrdad: Tôi đã đề cập đến, con trỏ tới các đối tượng const-volatile như sau: 'unsigned char const volatile * hd_addr;' –

+1

Yeah, của bạn ví dụ cho thấy 'const volatile int T = 10;' là khác nhau. :) – Mehrdad

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