Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Hàm Inline trong C++

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 inline chỉ 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 variable cho 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ểmNhược điểm
Loại bỏ call overheadTă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ềuKhô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.