2012-11-03 25 views

Trả lời

7

ví dụ:

x = 0; 

Nếu x không phải là volatile, trình biên dịch sẽ thấy rằng nó không sử dụng và có thể sẽ loại bỏ nó (hoặc là x = 0; tuyên bố hoặc thậm chí biến bản thân) hoàn toàn từ mã được tạo ra như một tối ưu hóa.

Tuy nhiên, từ khóa volatilechính xác để ngăn trình biên dịch thực hiện việc này. Về cơ bản nó nói với trình tạo mã "bất cứ điều gì bạn nghĩ biến này là/không, đừng đoán lần thứ hai, tôi cần nó." Vì vậy, sau đó trình biên dịch sẽ xử lý biến biến động như được truy cập và nó sẽ phát ra mã thực tế tương ứng với biểu thức.

+0

Tôi vừa thử nghiệm nó và bạn là chính xác. Cửa hàng 'x = 0' được loại bỏ trong phiên bản không biến đổi trong gcc -O2, trong khi nó không có phiên bản dễ bay hơi. –

+0

"bạn đúng" - tôi luôn chính xác. (JK): P Bạn được chào đón. –

+2

Đây là một "sự tổng quát hóa" về tính sai lệch từ cụ thể đến chung. :) –

2

Điều này có thể không phải là ví dụ ngắn nhất, nhưng đó là một sử dụng chung của volatile trong hệ thống nhúng, giả sử x điểm đến địa chỉ của một thanh ghi, nếu volatile không được sử dụng, trình biên dịch sẽ cho rằng giá trị của x doesn 't thay đổi và sẽ loại bỏ các vòng lặp:

volatile long *x = (long*) REGISTER_BASE; 
while (!(x&0x01)) { 
    //do nothing; 
} 
0

Bạn cũng có thể thử điều này:

x=1; 
x=2; 
return x; 

Bật tối ưu hóa một chec k tháo gỡ cho cả hai.

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