Hàm inline trong C++
Trước khi đi chi tiết vào hàm inline, tôi xin được phép trích dẫn một câu hỏi và câu trả lời.
Ai có thể giải thích chi tiết cho mình hàm inline có tác dụng gì và khi chạy như thế nào ạ;
Lấy cái code này làm ví dụ cho dễ nói ạ
#include<iostream>
using namespace std;
inline void t(int &x,int &y)
{
int c;
c=x;
x=y;
y=c;
}
void f(int &x,int &y)
{
int c;
c=x;
x=y;
y=c;
}
int main()
{
int a,b;
cout<<"NHap vao a va b "<<endl;
cin>>a>>b;
f(a,b);
cout<<a<<" "<<b;
system("pause");
}
Đối với hàm thông thường, khi bạn biên dịch, lời gọi hàm của bạn sẽ có dạngCALL function_name(..)
tức là nó đặt vào chỗ đó 1 địa chỉ chỉ đến nơi định nghĩa hàm. Khi thực hiện, chương trình sẽ nhảy đến địa chỉ đó, thực hiện với những tham số bạn đã truyền cho hàm. Thực hiện xong hàm thì sẽ quay lại chương trình, bắt đầu từ sau lời gọi hàm.
Với hàm inline, nếu bạn đã biết ý nghĩa của tiền xử lý #define khi định nghĩa macro thì inline cũng tương tự thế, nhưng chỉ là tương tự thôi.
Cụ thể, nếu hàm được định nghĩa là inline, khi biên dịch, trình dịch sẽ "cố gắng" thay thế lời gọi hàm bằng đoạn code được viết bên trong hàm. Khi được thay thế, ở chỗ lời gọi hàm, chương trình của bạn sẽ không còn là lệnh CALL kia nữa, mà là code của lời gọi hàm, với các biến đã được thay thế bằng các tham số tương ứng bạn truyền cho hàm.
Việc thay thế ở đây là không đảm bảo 100% - nó phụ thuộc vào trình dịch. Khi được thay thế, kết quả sẽ tương tự như việc sử dụng #define. Do tránh được việc backup các giá trị hiện tại vào stack, nhảy đến hàm để thực hiện ... nên sẽ nhanh hơn lời gọi hàm thông thường. Nhưng khi không được thay thế, thì nó sẽ giống như lời gọi hàm thông thường.
Vậy, với đoạn code ví dụ của bạn, nếu chỗ bạn gọi f(a, b) được thay thế bằng t(a, b) và nếu trình dịch thực hiện inline hàm t() của bạn, thì hàm main() của bạn khi biên dịch sẽ trở thành:
int main()
{
int a,b;
cout<<"NHap vao a va b "<<endl;
cin>>a>>b;
{
int c;
c=a;
a=b;
b=c;
}
cout<<a<<" "<<b;
system("pause");
}
Còn nếu bạn gọi hàm f(a, b) hoặc khi hàm t() của bạn không được trình dịch thay thế inline thì hàm main() hoàn toàn giống như code bạn đã viết.
Trong C++, người ta khuyên nên sử dụng inline thay vì dùng #define vì: inline vẫn là 1 hàm - tức là có check kiểu của biến truyền cho hàm, còn #define thì không.
Một chút thông tin nữa :
+ Khi được khai báo inline do việc thay thế lời gọi hàm bằng chính đoạn mã của hàm đó như vậy nên tránh được việc gọi hàm giảm thời gian thực thi nhưng đồng thời kích thước của chương trình cũng tăng lên.
+ Tuy nhiên thường thì compiler sẽ ignore gần như toàn bộ khai báo inline đó, chỉ trừ những hàm cực kì nhỏ và thường xuyên được sử dụng
Ok. còn bên dưới là bài viết bằng tiếng anh. mời bạn tham khảo
C++ inline function is powerful concept that is commonly used with classes. If a function is inline, the compiler places a copy of the code of that function at each point where the function is called at compile time.
Any change to an inline function could require all clients of the function to be recompiled because compiler would need to replace all the code once again otherwise it will continue with old functionality.
To inline a function, place the keyword inline before the function name and define the function before any calls are made to the function. The compiler can ignore the inline qualifier in case defined function is more than a line.
A function definition in a class definition is an inline function definition, even without the use of the inline specifier.
Following is an example, which makes use of inline function to return max of two numbers:
#include <iostream> using namespace std; inline int Max(int x, int y) { return (x > y)? x : y; } // Main function for the program int main( ) { cout << "Max (20,10): " << Max(20,10) << endl; cout << "Max (0,200): " << Max(0,200) << endl; cout << "Max (100,1010): " << Max(100,1010) << endl; return 0; }
When the above code is compiled and executed, it produces the following result:
Max (20,10): 20 Max (0,200): 200 Max (100,1010): 1010
0 comments :
Post a Comment