Inline function gợi ý compiler thay thế lời gọi hàm bằng bản thân code hàm tại chỗ gọi (compile-time), loại bỏ overhead gọi hàm (push/pop stack, jump).
Cú pháp
inline int max(int a, int b) { return (a > b) ? a : b; }
Đặc điểm
- Từ khóa
inlinechỉ là gợi ý – compiler có thể bỏ qua nếu hàm quá phức tạp, đệ quy, virtual, function pointer... - Hàm định nghĩa bên trong class mặc định là inline (implicit inline).
- Phải định nghĩa trong header (hoặc cùng TU) để compiler thấy body khi compile gọi.
- C++17:
inline variablecho static data member.
Ví dụ
#include <iostream>
using namespace std;
inline int Max(int x, int y) { return (x > y) ? x : y; }
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;
}
Kết quả
Max(20,10): 20 Max(0,200): 200 Max(100,1010): 1010
Ưu / Nhược điểm
| Ưu điểm | Nhược điểm |
|---|---|
| Loại bỏ call overhead | Tăng code size (code bloat) → instruction cache miss |
| Cho phép tối ưu hóa inter-procedural (constant propagation, dead code elim) | Thay đổi inline function → recompile tất cả TU include header |
| Phù hợp hàm nhỏ, gọi nhiều | Không dùng cho hàm lớn, đệ quy, virtual |
Khi nào KHÔNG inline được
- Hàm đệ quy (trừ khi compiler unroll).
- Hàm ảo (virtual) – gọi qua vtable.
- Hàm qua con trỏ hàm.
- Hàm có static local variable (mỗi TU có bản copy riêng → vi phạm ODR).
- Hàm quá lớn (heuristic compiler).
Best Practice
- Định nghĩa hàm nhỏ trong header +
inline(hoặc trong class). - Dùng
constexpr(C++11) cho hàm tính toán compile-time – ngầm inline. - Tránh inline hàm lớn – dùng
__attribute__((always_inline))(GCC/Clang) chỉ khi profile chứng minh cần. - Link-time optimization (LTO / -flto) cho phép inline cross-TU mà không cần header.