Константы constexpr внутри функции constexpr?

Предположим, у меня есть статическая функция, которая принимает перечисление и возвращает указатель cstring для отладки.

Функция может быть constexpr, но не гарантируется, что ее всегда можно будет вычислить во время компиляции. Скажем, он работает на микроконтроллере, и это сигнализирует о событиях из стека Bluetooth; например, устройство подключено, отключено, данные получены и т. д. для контекста. Таким образом, параметр не обязательно известен во время компиляции.

Есть ли какая-либо ценность, смысл или разница в том, что cstrings также определены как constexpr или нет?

Сжатый пример того, что я имею в виду:

      #include <cstdio>

enum myEnum
{
    EVENT1,
    EVENT2,
    EVENT3
};

static constexpr const char* foo(const myEnum i)
{
    // Does having these as constexpr change anything?
    /*constexpr*/ const char* text1 = "Text1";
    /*constexpr*/ const char* text2 = "Text2";
    /*constexpr*/ const char* text3 = "Text3";
    /*constexpr*/ const char* textUndef = "TextUndef";

    switch (i)
    {
    case EVENT1:
        return text1;
    case EVENT2:
        return text2;
    case EVENT3:
        return text3;
    default:
        return textUndef;
    }
}

int main()
{
    const char* x = foo(EVENT1);
    const char* y = foo(/*some value only known at runtime*/);

    printf(x);
    printf(y);

    return 1;
}

Я компилирую с gcc для cpp17 для встроенного микроконтроллера. Обычно либо с -Og, либо с -Os.

1 ответ

Объявление переменных const char* constexpr в foo() не добавляет никакой ценности, потому что вы не используете их constexpr-ность внутри функции.

В main вы можете объявить x как constexpr, чтобы быть уверенным, что значение x присваивается во время компиляции. Это может быть полезно, поскольку вызов функции constexpr (даже при передаче литеральных значений) не гарантирует, что она будет вычислена во время компиляции. Однако есть одна загвоздка: вы больше не сможете изменять указатель (x станет const char *const, то есть константным указателем на const char).

y всегда оценивается во время выполнения, поэтому вы не можете объявить его constexpr.

Я предлагаю попробовать свои фрагменты на godbolt.org, чтобы увидеть результаты с различными вариантами оптимизации.

Другие вопросы по тегам