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; }