Атрибуты const / pure GNU против constexpr - PullRequest
3 голосов
/ 31 марта 2020

GNU C и C ++ предлагают атрибуты функций const и pure. Из онлайн-документов gnu (выделено мной):

В GNU C и C ++ вы можете использовать атрибуты функций для указания определенных свойств функций, которые могут помочь компилятору оптимизировать вызовы или проверять код внимательнее для правильности. Например, вы можете использовать атрибуты, чтобы указать, что функция никогда не возвращает (noreturn), возвращает значение, зависящее только от значений своих аргументов (const) , или имеет аргументы в стиле printf (формат).

Там, где атрибут const кажется надмножеством чистого, также взятым из gnu docs :

Атрибут const накладывает большие ограничения на определение функции чем аналогичный чистый атрибут. Диагностируется одна и та же функция с атрибутом const и pure.

В C ++ 11 был добавлен спецификатор constexpr .

При применении для функций, есть ли разница между атрибутом const и спецификатором constexpr? G CC применяет различные оптимизации?

Аналогичный вопрос звучит так: Разница между `constexpr` и` const` . Но я думаю, что это не дубликат. Мой вопрос касается именно атрибута функции const, который, кажется, имеет перекрывающуюся функциональность с constexpr.

Ответы [ 2 ]

3 голосов
/ 31 марта 2020

Применительно к функциям есть ли разница между атрибутом const и спецификатором constexpr?

Есть различия.

Во-первых, C не есть constexpr, поэтому вы не можете воспользоваться этим на этом языке.

Вызовы функции constexpr могут быть константными выражениями. Таким образом, их результат может использоваться, например, как размер массива. Атрибуты GNU не могут использоваться для достижения того же (игнорируя расширение языка G CC VLA).

Функции Constexpr хороши для использования преимуществ предварительного расчета во время компиляции. Атрибуты GNU по-прежнему полезны для того, чтобы позволить компилятору использовать преимущества постоянства времени выполнения. Например, скажем, есть функция, которая не может быть constexpr - возможно, потому что она вызывает функцию не-constexpr. Но мы можем знать, что каждый вызов функции производит один и тот же вывод без побочных эффектов. Атрибут const позволяет компилятору не повторять избыточные вызовы.

Другое отличие состоит в том, что функции constexpr должны быть определены встроенными. Не-constexpr функции не должны быть определены встроенными.

1 голос
/ 31 марта 2020

Другое отличие состоит в том, что функция __attribute__ ((const)) должна возвращать одно и то же выходное значение для того же аргумента (если я не ошибаюсь; я впервые вижу этот атрибут;) . Это не нужно держать для constexpr функций.

academi c пример:

constexpr int rand(int n)
{
   std::string_view sv(__TIME__);
   return sv.back() % n;
}

std::array<int, rand(10) + 1> a;  // exemplary usage

Хотя rand равен constexpr, он может выдавать разные выходные данные для одного и того же входного аргумента.

...