Trong C/C++, một hàm mà được inline, và bạn gọi hàm đó ở các vị trí đâu đó, thì khi compile, compiler sẽ thay thế những chỗ đó bằng chính đoạn code trong hàm inline, và xử lý trực tiếp luôn chứ không gọi hàm.
Lợi ích: tránh chi phí overhead mỗi lần gọi hàm trong C/C++, chi phí đó bao gồm tạo stack frame, đưa các giá trị thanh ghi vào stack, truyền tham số vào stack, tăng con trỏ stack…và đó mới chỉ là chi phí khi gọi, overhead bao gồm chi phí khi kết thúc hàm nữa. Vì thế nếu một hàm được gọi rất nhiều lần (trong các vòng lặp lồng nhau chẳng hạn) thì chi phí overhead có thể đáng kể và chậm hơn rõ rệt so với inline hàm đó.
Khuyết điểm: nếu hàm cần inline có code rất dài mà chương trình của bạn không gọi hàm đó nhiều lần lắm mà gọi ở nhiều nơi thì khi biên dịch code của hàm đó được chèn nhiều chỗ khiến chương trình dung lượng lớn hơn.
May mắn là theo mình tìm hiểu, các compiler C/C++ hiện giờ đủ thông minh để tự động nên hay không nên inline một cách hiệu quả. Việc bạn dung cú pháp “inline” chẳng qua chỉ là “gợi ý” cho compiler thôi, muốn nó bắt buộc inline hàm nào đó thì dùng “__forceinline”
Macro là tên đại diện của một đoạn code nào đó (giống như VND đại diện cho Việt Nam Đồng ấy ^^), được cài đặt bằng #define. Mục tiêu của nó là giúp lập trình viên viết nhanh các đoạn code lặp đi lặp lại nhiều nhưng có cấu trúc giống nhau. Chẳng hạn:
//với mỗi(mảng, vị trí)
#define voimoi(mang, vitri) for(vitri = 0; vitri < mang.size(); vitri++)
int main() {
std∷vector<int> m;
…
int i;
voimoi(m, i)
printf(“%d ”, m[i]);
Tóm lại, inline giúp chương trình bạn chạy nhanh hơn (nên để compiler tự động) và macro giúp bạn viết code nhanh hơn (và có thể khả quang, đọc dễ hiểu hơn tùy mình cài đặt)