Inline функции

inline функции — это функции, которые компилятор пытается встроить в точку вызова вместо обычного вызова функции. Это помогает уменьшить накладные расходы на вызов функции и может улучшить производительность для небольших функций.

Info

Если вы знакомы с Unreal Engine, это вам может быть знакомо как макросы

Примеры

  1. Объявление и определение inline функции:

    inline int square(int x) {
        return x * x;
    }
  2. Определение inline функции в классе (неявно inline):

    class Math {
    public:
        int square(int x) {
            return x * x;
        }
    };

Constexpr функции

constexpr функции — это функции, которые могут быть вычислены во время компиляции, если их аргументы известны на этапе компиляции. Такие функции помогают в оптимизации, так как позволяют вычислять значения на этапе компиляции, а не во время выполнения.

Примеры

  1. Объявление и определение constexpr функции:

    constexpr int factorial(int n) {
        return (n <= 1) ? 1 : (n * factorial(n - 1));
    }
  2. Использование constexpr функции:

    constexpr int result = factorial(5);  // Результат вычисляется во время компиляции

Атрибуты функций

Атрибуты функций — это специальные метаданные, которые добавляют дополнительную информацию о функции. Они могут управлять оптимизацией, отладкой и другими аспектами компиляции.

Примеры

  1. [[nodiscard]]: Указывает, что возвращаемое значение функции не должно быть проигнорировано.

    [[nodiscard]] int computeValue() {
        return 42;
    }
  2. [[deprecated]]: Указывает, что функция устарела и её использование не рекомендуется.

    [[deprecated("Use newFunction instead")]]
    void oldFunction() {
        std::cout << "This function is deprecated." << std::endl;
    }
  3. [[maybe_unused]]: Указывает, что переменная или параметр может не использоваться, чтобы избежать предупреждений компилятора.

    void func([[maybe_unused]] int unusedParam) {
        std::cout << "This parameter might be unused." << std::endl;
    }

Примеры комплексного использования

  1. Комбинация constexpr и атрибутов:

    [[nodiscard]] constexpr int power(int base, int exp) {
        return (exp == 0) ? 1 : (base * power(base, exp - 1));
    }
  2. Использование 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;
    }