Nếu một hàm gọi vô điều kiện một hàm _Noreturn
, trình biên dịch sẽ có thể hiểu rằng:
- mã sau đây là mã chết, cho phép tối ưu hóa (nó có thể được loại bỏ khỏi tạo ra nhị phân) và chẩn đoán - trình biên dịch sẽ có thể phát ra cảnh báo "mã không thể truy cập";
quan trọng nhất, biết rằng luồng bình thường từ chức năng bị gián đoạn nó sẽ có thể tránh cảnh báo giả mạo về giá trị trả về bị mất, biến chưa được khởi tạo và tương tự. Điều này đặc biệt quan trọng với các máy phân tích mã tĩnh - số lượng các kết quả sai được đưa ra bởi máy phân tích tĩnh CLang trong một ứng dụng lớn của chúng ta giảm đáng kể khi chúng tôi đánh dấu chức năng die
của chúng tôi (đăng nhập một lỗi nghiêm trọng và chấm dứt ứng dụng) là noreturn
.
Có thể có một số tối ưu hóa khác - vì hàm này không bao giờ trả về, không cần phải đẩy địa chỉ trả về trên ngăn xếp, lưu trạng thái đăng ký và bất cứ điều gì, tất cả những gì cần thiết là chuyển lập luận và thực hiện jmp
để bắt đầu chức năng, mà không phải lo lắng về việc trả lại và dọn dẹp sau khi trả về. Nhưng tất nhiên, kể từ khi cuộc gọi là một-shot, hiệu suất để ép ở đây là chủ yếu là không đáng kể.
Nguồn
2012-12-03 20:48:54
http://stackoverflow.com/questions/10538291/what-is-the-point-of-the-noreturn-attribute sẽ hỏi cùng một câu hỏi cho C++. Lý do cho C là chính xác như nhau. –
Lý do tương tự; cú pháp có vẻ khác hoàn toàn giữa C++ ('[[noreturn]]') và C ('_Noreturn' hoặc' noreturn' nếu bạn đã bao gồm ''). Vì vậy, tôi muốn coi đó là một x-ref tốt; Tôi không chắc chắn về bản sao, mặc dù. –
Đề cử cho mở lại vì đây là về C, và khác là về C + +, hai ngôn ngữ hoàn toàn khác nhau. Cú pháp thực tế cũng rất khác nhau. –