2009-11-03 34 views
15

Biến biến động được lưu trữ trong bộ nhớ chương trình được lưu trong bộ phận nào (trong phần nào)?Biến dễ bay hơi

Trả lời

7

Biến động của một biến không thay đổi vị trí mà một biến được lưu trữ. Những gì nó thay đổi là ngữ nghĩa xung quanh cách nó được truy cập đối với việc đọc và viết.

Tôi không tin tiêu chuẩn C nói bất cứ điều gì về việc thực hiện dễ bay hơi. Nhưng thông thường, volatile đảm bảo phát hành ngữ nghĩa cho các hoạt động ghi trên một biến và ngữ nghĩa về các hoạt động đọc của một biến. Điều này sẽ không đúng đối với mọi triển khai mặc dù và bạn nên đọc về những gì trình biên dịch cụ thể của bạn đảm bảo

+0

không, nó KHÔNG cung cấp cho các ngữ nghĩa đó xem [this] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2016.html) và [CERT] (https : //www.securecoding.cert.org/confluence/display/seccode/POS03-C.+Do+not+use+volatile+as+a+synchronization+primitive) nói 'không sử dụng 'biến động' để đồng bộ hóa' – Spudd86

2

Không có lý do gì cho một biến dễ bay hơi được lưu trữ trong bất kỳ phần "đặc biệt" nào của bộ nhớ. Nó thường được lưu trữ cùng với bất kỳ biến nào khác, kể cả các biến không bay hơi. Nếu một số trình biên dịch quyết định lưu trữ các biến biến động trong một số phần đặc biệt của bộ nhớ - không có gì để ngăn chặn nó làm như vậy. Nhưng ở cấp độ ngôn ngữ hoàn toàn không có lý do cho việc này.

Tại sao bạn hỏi một câu hỏi như vậy? Điều gì khiến bạn nghĩ rằng nó nên được lưu trữ trong một số phần đặc biệt của bộ nhớ?

9

Trong C volatile chỉ thông báo cho trình biên dịch - "Bạn không có đủ kiến ​​thức để giả định giá trị của biến này không thay đổi". Không có "phần", ví dụ như BSS, CSS cho nó.

Hãy coi đó là một lá cờ của trình biên dịch để ngăn chặn một số loại tối ưu hóa nhất định. Nó rất tiện dụng trong lập trình nhúng, trong đó bộ nhớ tại một địa chỉ nào đó có thể "thay đổi" do đầu vào thiết bị phần cứng.

Dưới đây là một lời giải thích tốt: http://www.embedded.com/columns/programmingpointers/174300478?_requestid=137658

+0

Trong khi tối ưu hóa, từ nơi trình biên dịch sẽ nhận được giá trị giả định này? Tôi có nghĩa là một phần của bộ nhớ? – kapilddit

+1

Nó phụ thuộc, thường trình biên dịch "nhớ" giá trị đó nằm trong thanh ghi CPU. dễ bay hơi lực lượng trình biên dịch để không bao giờ làm cho rằng giả định, và tải lại giá trị mỗi truy cập (thường là từ bộ nhớ chính). – Justicle

21

volatile là một không type qualifier một storage class specifier, vì vậy nó không xác định vị trí lưu trữ ở tất cả; nó ảnh hưởng đến định nghĩa kiểu của biến, không ảnh hưởng đến kiểu của nó. Đơn giản chỉ cần buộc trình biên dịch đọc một biến rõ ràng có loạivolatile từ vị trí lưu trữ của biến (bất cứ nơi nào có thể) thay vì giả định rằng một số giá trị đã đọc trước đây trong sổ đăng ký ví dụ vẫn hợp lệ.

4

dễ bay hơi không có gì để giải quyết với lớp lưu trữ.

dễ bay hơi chỉ cần trình biên dịch hoặc buộc trình biên dịch "không thực hiện tối ưu hóa" cho biến đó. vì vậy trình biên dịch sẽ không tối ưu hóa mã cho biến đó và đọc giá trị từ vị trí được chỉ định, không thông qua đăng ký giữa các giá trị giữ trước đó.

Vì vậy, bằng cách tuyên bố biến là dễ bay hơi .. nó cho garrantee rằng bạn sẽ nhận được giá trị mới nhất, có thể được thay đổi bởi một sự kiện bên ngoài.

Mã của bạn có thể hoạt động tốt nếu không khai báo biến đó là dễ bay hơi, nhưng đôi khi có thể không nhận được giá trị chính xác .. để tránh điều đó.

Biến động thường được sử dụng khi xử lý các sự kiện bên ngoài, chẳng hạn như ngắt các chân liên quan đến phần cứng.

ví dụ. đọc giá trị adc.

const voltile nghĩa là bạn không thể sửa đổi hoặc thay đổi giá trị của biến đó trong mã. chỉ sự kiện bên ngoài mới có thể thay đổi giá trị.

Ghim điều khiển thường được định nghĩa là dễ bay hơi. có thể bằng cách khai báo biến là bộ điều khiển dễ bay hơi sẽ làm "đọc bằng ghim" chứ không phải "đọc bằng chốt" ... đây là giả định của tôi. có thể sai ...

nhưng vẫn còn rất nhiều sự nhầm lẫn khi chọn biến như dễ bay hơi ..

Một biến cần được khai báo biến động bất cứ khi nào giá trị của nó có thể thay đổi bất ngờ. Trên thực tế, chỉ có ba loại biến có thể thay đổi:

  1. thanh ghi ngoại vi Ánh xạ bộ nhớ

  2. biến toàn cầu thay đổi bởi một dịch vụ ngắt thói quen

  3. biến toàn cầu trong một đa luồng ứng dụng

Liên kết: http://eetimes.com/discussion/beginner-s-corner/4023801/Introduction-to-the-Volatile-Keyword

Vì vậy, nó được coi là biến như dễ bay hơi trong các trường hợp như vậy.

1

"Dễ bay hơi" được sử dụng trong thông số kỹ thuật C/C++ để cho phép sử dụng các thiết bị được ánh xạ bộ nhớ. Nó chỉ đạo trình biên dịch không tối ưu hóa biến được định nghĩa với từ khóa này, chỉ vì biến dường như không thay đổi trạng thái của nó trong mã có thể nhìn thấy trình biên dịch.

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