Inline функции
inline
функции — это функции, которые компилятор пытается встроить в точку вызова вместо обычного вызова функции. Это помогает уменьшить накладные расходы на вызов функции и может улучшить производительность для небольших функций.
Info
Если вы знакомы с Unreal Engine, это вам может быть знакомо как макросы
Примеры
-
Объявление и определение
inline
функции:inline int square(int x) { return x * x; }
-
Определение
inline
функции в классе (неявно inline):class Math { public: int square(int x) { return x * x; } };
Constexpr функции
constexpr
функции — это функции, которые могут быть вычислены во время компиляции, если их аргументы известны на этапе компиляции. Такие функции помогают в оптимизации, так как позволяют вычислять значения на этапе компиляции, а не во время выполнения.
Примеры
-
Объявление и определение
constexpr
функции:constexpr int factorial(int n) { return (n <= 1) ? 1 : (n * factorial(n - 1)); }
-
Использование
constexpr
функции:constexpr int result = factorial(5); // Результат вычисляется во время компиляции
Атрибуты функций
Атрибуты функций — это специальные метаданные, которые добавляют дополнительную информацию о функции. Они могут управлять оптимизацией, отладкой и другими аспектами компиляции.
Примеры
-
[[nodiscard]]
: Указывает, что возвращаемое значение функции не должно быть проигнорировано.[[nodiscard]] int computeValue() { return 42; }
-
[[deprecated]]
: Указывает, что функция устарела и её использование не рекомендуется.[[deprecated("Use newFunction instead")]] void oldFunction() { std::cout << "This function is deprecated." << std::endl; }
-
[[maybe_unused]]
: Указывает, что переменная или параметр может не использоваться, чтобы избежать предупреждений компилятора.void func([[maybe_unused]] int unusedParam) { std::cout << "This parameter might be unused." << std::endl; }
Примеры комплексного использования
-
Комбинация
constexpr
и атрибутов:[[nodiscard]] constexpr int power(int base, int exp) { return (exp == 0) ? 1 : (base * power(base, exp - 1)); }
-
Использование
inline
и атрибутов:[[deprecated("Use newAdd instead")]] inline int oldAdd(int a, int b) { return a + b; } inline int newAdd(int a, int b) { return a + b; }