Inline C++ là gì

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++ đượ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.

Vì sao phải sử dụng hàm nội tuyến?

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ì bạ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 bạ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, trình biên dịch 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.

Trong C++ 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], một hàm nội tuyến phải được định nghĩa trong tất cả các module sử dụng hàm đó, trong khi đó chỉ cần định nghĩa các hàm thông thường trong một module mà thôi. Điều này cho phép biên dịch các module một cách độc lập với tất cả các module khác.

Hàm nội tuyến trong C++

Việc gọi một hàm thường gây ra hao tổn tài nguyên nhất định [Overhead – Ví dụ: xếp chồng lên nhau [stacking arguments], nhảy [jumps], vv ..], và do đó đối với các hàm rất ngắn, có thể hiệu quả hơn chỉ đơn giản là chèn mã của hàm nơi nó được gọi, thay vì thực hiện quá trình chính thức gọi một hàm.

Thêm inline vào trước một khai báo hàm sẽ thông báo cho trình biên dịch rằng hàm nội tuyến được ưa thích hơn cơ chế gọi hàm thông thường cho một hàm cụ thể. Điều này không thay đổi ở tất cả các chức năng và cách vận hành của một hàm, nhưng chỉ đơn giản là được sử dụng để đề nghị trình biên dịch rằng mã được tạo ra bởi thân hàm sẽ được chèn vào tại mỗi điểm mà hàm được gọi, thay vì hàm được gọi một cách thông thường.

Ví dụ, hàm có chức năng nối hai chuỗi sẽ được khai báo là hàm nội tuyến như sau:

inline string concatenate [const string& a, const string& b] { return a+b; }

Điều này thông báo trình biên dịch rằng khi hàm concatenate được gọi, chương trình thích hàm được mở rộng nội tuyến, thay vì thực hiện việc gọi hàm một cách thông thường. inline chỉ được xác định trong khai báo hàm, không phải khi nó được gọi.

Lưu ý rằng hầu hết các trình biên dịch đã tối ưu hóa mã để tạo các chức năng nội tuyến khi nó nhìn thấy một cơ hội để nâng cao hiệu quả, thậm chí nếu không được đánh dấu rõ ràng với từ khoá inline. Vì vậy, từ khoá này chỉ đơn thuần chỉ ra trình biên dịch rằng nội tuyến được ưa thích cho chức năng này, mặc dù trình biên dịch được tự do không inline nó, và tối ưu hóa khác. Trong C ++, tối ưu hóa là một nhiệm vụ được ủy thác cho trình biên dịch, tự do tạo ra bất kỳ mã nào miễn là hành vi kết quả được xác định bởi mã.

Hàm inline trong C++ là khái niệm mạnh mẽ mà được sử dụng phổ biến với các lớp. Nếu một hàm là inline, thì compiler đặt một bản sao code của hàm đó tại mỗi vị trí mà hàm đó được gọi tại compile time.

Bất kỳ thay đổi nào tới một hàm inline có thể đòi hỏi tất cả các khách của hàm đó để được tái biên dịch bởi vì compiler sẽ cần thay thế tất cả code một lần nữa, nếu không thì nó sẽ tiếp tục với tính năng cũ.

Để làm một hàm là inline, đặt từ khóa inline ở trước tên hàm đó và định nghĩa hàm trước khi bất kỳ lời gọi được tạo ra với hàm đó. Compiler có thể bỏ qua định danh inline trong trường hợp hàm đã định nghĩa là nhiều hơn một dòng.

Một định nghĩa hàm trong một định nghĩa lớp là một định nghĩa hàm inline, ngay cả khi không sử dụng định danh inline.

Sau đây là ví dụ sử dụng hàm inline để trả về giá trị lớn nhất của hai số:

#include using namespace std; inline int Max[int x, int y] { return [x > y]? x : y; } // ham main cua chuong trinh int main[ ] { cout

Chủ Đề