Bài 14: Hàm Nội Tuyến (Inline Function) Trong C++ - DNMTechs

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ã.

Từ khóa » Hàm Nội Tuyến