inline
thực hiện hai điều:
- mang đến cho bạn một miễn từ "một quy tắc định nghĩa" (xem dưới đây). luôn áp dụng.
- Cung cấp cho trình biên dịch một gợi ý để tránh cuộc gọi hàm. Trình biên dịch là miễn phí để bỏ qua điều này.
# 1 Có thể rất hữu ích (ví dụ: đặt định nghĩa trong tiêu đề nếu ngắn) ngay cả khi # 2 bị tắt.
Trong các trình biên dịch thực hành thường làm một công việc tốt hơn để làm việc ra những gì để nội tuyến chính mình (đặc biệt là nếu tối ưu hóa hướng dẫn hồ sơ có sẵn).
[EDIT: Tài liệu tham khảo đầy đủ và văn bản có liên quan]
Hai điểm trên cả hai theo từ tiêu chuẩn ISO/ANSI (ISO/IEC 9899: 1999 (E), thường được gọi là "C99") .
Trong §6.9 "Định nghĩa bên ngoài", đoạn 5:
Một định nghĩa bên ngoài là một tuyên bố bên ngoài mà còn là một định nghĩa của một hàm (trừ một định nghĩa inline) hoặc một đối tượng. Nếu một định danh được khai báo với liên kết bên ngoài được sử dụng trong một biểu thức (không phải là một phần của toán hạng của toán tử sizeof có kết quả là hằng số nguyên), một nơi nào đó trong toàn bộ chương trình sẽ có chính xác một định nghĩa bên ngoài cho định danh; nếu không, sẽ không có nhiều hơn một.
Trong khi định nghĩa tương đương trong C++ được khai thác có tên là Quy tắc một định nghĩa (ODR), nó phục vụ cùng một mục đích. Các phần tử bên ngoài (tức là không "tĩnh" và do đó cục bộ cho một Đơn vị dịch - thường là một tệp nguồn duy nhất) chỉ có thể được xác định khi chỉ trừ khi nó là một hàm và nội tuyến.
Trong §6.7.4, "Các chỉ số chức năng", từ khóa nội tuyến được xác định:
Thực hiện chức năng một chức năng nội tuyến cho phép gọi hàm là nhanh nhất có thể. [118] Mức độ đề xuất như vậy có hiệu lực là được xác định thực hiện.
Và chú thích (không quy chuẩn), nhưng cung cấp làm rõ:
Bằng cách sử dụng, ví dụ, một thay thế cho cơ chế chức năng cuộc gọi thông thường, chẳng hạn như ‘‘inline thay’’. Thay thế nội tuyến không phải là thay thế văn bản, cũng không tạo ra một hàm mới. Do đó, ví dụ, việc mở rộng một macro được sử dụng bên trong phần thân của hàm sử dụng định nghĩa mà nó có tại điểm mà phần tử hàm xuất hiện, và không phải là nơi hàm được gọi; và số nhận dạng tham chiếu đến các khai báo trong phạm vi nơi cơ thể xảy ra. Tương tự như vậy, hàm có một địa chỉ duy nhất, bất kể số định nghĩa nội tuyến xảy ra ngoài định nghĩa bên ngoài.
Tóm tắt: hầu hết người dùng C và C++ mong đợi từ nội tuyến không phải là những gì họ nhận được. Mục đích chính của nó rõ ràng, để tránh các cuộc gọi chức năng trên không, là hoàn toàn tùy chọn. Nhưng để cho phép biên dịch riêng biệt, cần phải có sự thư giãn của định nghĩa đơn.
(Tất cả nhấn mạnh trong các trích dẫn từ tiêu chuẩn.)
EDIT 2: Một vài lưu ý:
- Có những hạn chế khác nhau về chức năng inline bên ngoài. Bạn không thể có một biến tĩnh trong hàm, và bạn không thể tham chiếu các đối tượng/hàm phạm vi TU tĩnh.
- Chỉ cần nhìn thấy điều này trên VC++ "whole program optimisation", là một ví dụ về trình biên dịch thực hiện nội tuyến riêng của nó, chứ không phải là tác giả.
Tôi nghi ngờ rằng giống như "đăng ký" trở nên lỗi thời vào cuối những năm 1980, "nội tuyến" đã lỗi thời trong một số năm. –
\ o /, chết "nội dòng"! – elmarco
Inline chắc chắn không lỗi thời. Bạn đã bao giờ đọc mã nguồn cho một hạt nhân hiện đại chưa? Nội tuyến là không thích hợp với những người viết các ứng dụng, nhưng những người đó không nên sử dụng C ngày nay, và nó cũng có liên quan đến việc lập trình hệ thống như trước đây. – nosatalian