Hàm nội tuyến

Trong khoa học máy tính, hàm nội tuyến (tiếng Anh: "inline function") là một cấu trúc trong ngôn ngữ lập trình được sử dụng để đề nghị với chương trình biên dịch rằng một hàm cụ thể nào đó là đối tượng của việc khai triển nội tuyến ("inline expansion"); có nghĩa là, nó đề nghị rằng chương trình biên dịch nên chèn toàn bộ thân hàm vào trong từng ngữ cảnh, nơi hàm đó được sử dụng.
Động cơ.
Khai triển nội tuyến thường được dùng để loại bỏ thời gian quá dụng ("overhead") xảy ra khi gọi một hàm; kỹ thuật này thường được dùng cho các hàm thực thi thường xuyên, vì khi đó thời gian quá dụng chiếm phần đáng kể. Hàm nội tuyến còn có tác dụng giảm không gian bộ nhớ mà các hàm nhỏ chiếm chỗ, đồng thời cho phép các kỹ thuật tối ưu hoá ("optimization") khác biến đổi mã.
Nếu không có hàm nội tuyến thì lập trình viên sẽ có rất ít hoặc không có quyền quyết định xem hàm nào được là hàm nội tuyến, hàm nào không; mà việc này sẽ hoàn toàn do trình biên dịch quyết định. Việc bổ sung khả năng điều khiển này cho phép lập trình viên khai thác các kiến thức đặc thù về chương trình ứng dụng, chẳng hạn những hàm thường xuyên được thực thi, để lựa chọn xem hàm nào cần là hàm nội tuyến. Tuy nhiên, nhiều trình biên dịch (chẳng hạn cho ngôn ngữ C++) giữ quyền quyết định cuối cùng về việc một hàm đã được lập trình đặt chế độ nội tuyến có thể thực sự được là một hàm nội tuyến hay không, quyết định này thường được dựa vào việc nội dung của hàm này có khả thi cho việc khai triển nội tuyến hay không.
Thêm nữa, trong một số ngôn ngữ, các hàm nội tuyến tương tác gần gũi với mô hình biên dịch ("compilation model"); chẳng hạn trong C++, một hàm nội tuyến phải được định nghĩa trong tất cả các môđun sử dụng hàm đó, trong khi đó chỉ cần định nghĩa các hàm thông thường trong một môđun mà thôi. Điều này cho phép biên dịch các môđun một cách độc lập với tất cả các môđun khác.
So sánh với macro.
Theo truyền thống, trong các ngôn ngữ như C, việc khai triển nội tuyến được thực hiện ở mức mã nguồn bằng cách sử dụng các macro có tham số ("parameterized macro"). Việc sử dụng hàm nội tuyến mang lại một số lợi điểm so với cách tiếp cận truyền thống này:
Bjarne Stroustrup, người thiết kế C++, nhấn mạnh rằng nên tránh sử dụng macro mỗi khi có thể tránh được, và khuyến khích sử dụng rộng rãi các hàm nội tuyến.
Hỗ trợ của ngôn ngữ.
C++, C99, và GNU C đều hỗ trợ hàm nội tuyến, song ANSI C (1990), phương ngữ phổ biến nhất của C trong thực tiễn, lại không hỗ trợ hàm nội tuyến. Trong ngôn ngữ lập trình ADA, hàm nội tuyến được sử dụng dưới hình thức của "pragma". Đa số các ngôn ngữ khác, trong đó có Java và các ngôn ngữ lập trình hàm ("functional languages"), không cung cấp hàm nội tuyến nhưng lại thực hiện khai triển nội tuyến rất mạnh. Các trình biên dịch khác nhau có thể khác nhau ở độ phức tạp của các hàm mà chúng có khả năng khai triển nội tuyến. Các bộ biên dịch C++ chính thống như Microsoft Visual C++ và GCC ("GNU Compiler Collection") có hỗ trợ một tùy chọn cho phép bộ biên dịch tự động biến mọi hàm có thể thành hàm nội tuyến, ngay cả khi các hàm này không được đánh dấu là hàm nội tuyến.
Một hàm nội tuyến có thể được viết trong C++ như sau:
 inline int max (int a, int b)
 if (a &gt; b)
 return a;
 else
 return b;
 a = max (x, y); "// hiện tương đương với "a = (x &gt; y ? x: y);""
Những vấn đề với các hàm nội tuyến.
Bên cạnh những vấn đề liên quan đến khai triển nội tuyến nói chung, với vai trò một tính năng của ngôn ngữ, hàm nội tuyến có thể không đáng giá như người ta có thể hình dung, vì một số lý do sau:
Về các vấn đề với chính bản thân quá trình tối ưu hóa, thay vì về tính năng của ngôn ngữ, xem các vấn đề trong khai triển nội tuyến.