inline
là gì? Tại sao phải dùng inline
? inline
sử dụng như thế nào?
Inline functions là gì?
Inline function (hàm nội tuyến) là một loại hàm trong ngôn ngữ lập trình C/C++. Với việc sử dụng từ khoá inline
, hàm này được sử dụng để đề nghị (không phải là bắt buộc) với compiler (trình biên dịch) thực hiện inline expansion (khai triển nội tuyến) với hàm đó hay nói cách khác là chèn code của hàm đó tại địa chỉ mà nó được gọi.
Cách sử dụng inline functions?
Nếu muốn sử dụng inline functions, chỉ cần đặt từ khoá inline
ở trước một hàm bình thường lúc khai báo hoặc ở dòng đầu tiên của hàm lúc định nghĩa. Khi sử dụng cứ gọi nó ra như gọi một hàm bình thường.
Ví dụ:
#include <iostream> using namespace std; // Cach khai bao 1 // inline void foo(); // void foo ( ) // { // cout<< “Welcome to stdio.vn”; // } // Cach khai bao 2 inline void foo ( ) { cout<< “Welcome to stdio.vn”; } int main ( ) { // Cach su dung foo( ); return 0; }
Những vấn đề cần lưu ý khi dùng inline functions
Inline functions có ích trong việc tiết kiệm thời gian, tuy nhiên nếu sử dụng với các hàm có kích thước lớn có thể làm cho chương trình chạy chậm hơn. Do đó chỉ nên sử dụng inline
với các chương trình nhỏ được gọi ra thường xuyên.
Trình biên dịch đôi khi có thể bỏ qua inline functions trong một số trường hợp như:
- Inline functions không được khai báo prototype (nguyên mẫu) nhưng lại đặt sau hàm
main
. Điều này sẽ bị gây lỗi trong quá trình compiler. - Nếu
inline
đã được đặt trước prototype thì không được đặt ở định nghĩa hàm, làm như thế sẽ dẫn đến chương trình lặp vô hạn. - Hàm có chứa các biến
static
, các lệnh chu trình, lệnhgoto
, lệnhswitch
, hàm đệ quy chắc chắn từ khoáinline
sẽ bị bỏ qua.
Mặt thuận lợi của inlines functions so với macro definition directives
inline functions cũng tương tự như macro definition directives vì code của hàm đều được inline expansion. Tuy nhiên, inline functions được compiler khai triển, trong khi đó các macro lại được khai triển bằng preprocessor (tức chỉ thị tiền xử lí, các bạn có thể tìm hiểu thêm về nó ở bài viết Preprocessor và #include Directive). Kết quả là có một số khác biệt quan trọng đã diễn ra làm cho macro definition directives không nên là lựa chọn đầu tiên cho người dùng. Những khác biệt đó là:
- Trong quá trình khai triển, macro có thể gây ra những hậu quả kèm theo mà bạn không mong muốn, vì những thể hiện của macro được sao chép vào bất cứ nơi nào mà chúng xuất hiện trong chương trình.
- Macro không an toàn vì nó có thể mở rộng bất kể là cú pháp có chính xác hay không, trong khi inline functions lại thực hiện kiểm tra điều này.
- Macro linh hoạt và phức tạp hơn trong việc biểu diễn các cấu trúc, thậm chí có khi là không thể biểu diễn được. Trong khi đó, inline functions sử dụng dễ dàng và quen thuộc như một hàm bình thường.
- Inline functions có thể cung cấp phạm vi cho các biến còn macro chỉ có thể làm điều này trong khối mã {…}.
- Lỗi biên dịch của các macro thường là các lỗi trong phần code đã được khai triển nên sẽ gây khó khăn cho các lập trình viên trong quá trình sửa lỗi.