(Trước khi tôi bắt đầu: Tôi biết có existingquestions về chủ đề này, nhưng không ai tôi đã tìm thấy câu trả lời tại sao đây là một vấn đề tôi làm điều đó thường xuyên và muốn biết nếu tôi đang tạo ra vấn đề tiềm ẩn..)Tại sao loại bỏ vòng loại dễ bay hơi trong một hàm gọi cảnh báo?
Tôi rất tò mò tại sao loại bỏ vòng loại dễ bay hơi trong một cuộc gọi hàm có giá trị cảnh báo trình biên dịch.
Tình hình là như sau:
volatile uint8_t thingy;
void awesome_function(uint8_t *arg);
awesome_function(&thingy); << warning
Bây giờ, sự hiểu biết của tôi là những volatile
vòng loại đánh dấu một biến là một trong đó có thể thay đổi theo những cách ngoài tầm kiểm soát của trình biên dịch. Một số tối ưu hóa (quan trọng nhất, theo kinh nghiệm của tôi, việc loại bỏ biến 'không sử dụng') bị vô hiệu hóa.
Tuy nhiên, nếu tôi đánh dấu biến là volatile
, tôi quan tâm đến việc ngăn tối ưu hóa trong phạm vi này. Nếu tôi chuyển biến đó thành một hàm, tôi thường hạnh phúc cho việc tối ưu hóa tiêu chuẩn để áp dụng trong hàm đó. *
Đây là trường hợp ngay cả khi trình biên dịch muốn xóa biến khỏi hàm (tối ưu hóa tôi bình thường cố gắng tránh), ngay cả khi nó làm như vậy, nó không ảnh hưởng đến việc tôi sử dụng nó trong phạm vi này; chức năng (kết quả của chính) là điểm thứ tự (và lvalue) mà tôi quan tâm.
Vì vậy, tại sao loại bỏ vòng loại đối với hàm gọi cảnh báo, vì nó sẽ không cho phép sắp xếp lại trong hiện tại phạm vi? Đây có phải là do khả năng sắp xếp lại trong phạm vi chức năng được gọi, không được phép cho biến số volatile
? Nếu vậy, tại sao đây là một vấn đề wrt phạm vi hiện tại?
(* điều này là bình thường vì các cuộc gọi như vậy được sử dụng để bắt đầu các hoạt động không đồng bộ, điều này cuối cùng sẽ hoạt động trên con trỏ được chuyển đến hàm đó. Bộ định tính volatile
có sẵn để cảnh báo trình biên dịch rằng biến cục bộ sẽ thay đổi không đồng bộ.)
Tôi chỉ muốn làm rõ: bạn nói rằng 'cuộc gọi chức năng có thể được tối ưu hóa' - bạn có nghĩa là nội dung của hàm hoặc cuộc gọi không? Tôi đã nghĩ rằng sau này sẽ không được tối ưu hóa. Một diễn viên rõ ràng là những gì tôi sử dụng tại thời điểm này (các cuộc gọi có xu hướng để bắt đầu hoạt động chia giai đoạn, và tôi biết biến sẽ không được xúc động ít nhất cho đến sau khi cuộc gọi trả về). – sapi
@ sapi- Tôi có nghĩa là "mã bên trong hàm có thể được tối ưu hóa theo giả định rằng đối tượng được trỏ tới sẽ không bị thay đổi bởi một nguồn bên ngoài." Điều đó có ý nghĩa? – templatetypedef
Trên các nền tảng mà các thanh ghi I/O có một không gian địa chỉ riêng, bỏ đi "dễ bay hơi" đôi khi có thể dẫn đến trình biên dịch truy cập vào vị trí tùy ý trong bộ nhớ khi nó truy cập vào thanh ghi I/O. Đáng kể hơn, tôi sẽ không tin tưởng các tác giả của các trình biên dịch "hiện đại" để tránh lạm dụng các quyền tự do được Tiêu chuẩn cấp để hành xử theo cách tùy ý mà không quan tâm đến việc có bất kỳ thực thể bên ngoài nào làm phiền lưu trữ trong câu hỏi hay không. – supercat