Функции pure/const в С++ 0x

В С++ 98/С++ 03 в языке нет ключевых слов функции pure/const.

  • Изменилось ли это в С++ 0x?

  • Если да, можно ли установить такой флаг даже на объектах функции (std::function)? Поэтому я могу передать некоторые функции указателя или лямбда-функции, а также дать информацию о том, что это чистая/const-функция? Вызываемая функция может иметь оптимизированный путь выполнения для такой функции.

  • Есть ли способ проверить, является ли данная функция чистой /const? То есть например, если на std::function есть такой флаг, как описано выше, я, вероятно, могу просто проверить этот флаг. Но, возможно, есть даже более общий способ.

Если он не изменился, почему бы и нет? Я думаю, что было бы очень полезно иметь такую ​​поддержку.

Есть ли открытые предложения об этом?

Ответ 1

  • Это изменилось в С++ 0x?

Нет. Существует constexpr, но это означает постоянную времени компиляции. Если его параметры constexprs тоже, то он выполняется во время компиляции, но в противном случае это обычная функция. Поскольку они должны быть определены в одной и той же единице перевода и состоят из одного оператора возврата, они, вероятно, будут встроены и вышеуказанная оптимизация будет выполнена. Он не может использоваться для предоставления информации о компиляторе относительно функции, связанной с внешней связью.

Если он не изменился, почему бы и нет? Я думаю, что было бы очень полезно иметь такую ​​поддержку.

На самом деле я не думаю, что вам это нужно. Язык уже слишком велик, и программист может легко переписать этот код, чтобы быть более эффективным на основе ее знаний в любом случае. В отличие от restrict он не предоставляет никакой информации, которая не может быть выражена другими средствами.

Есть ли открытые предложения об этом?

Я не видел каких-либо комитетов по этой теме.

Ответ 2

gcc использует __attribute__(( <attr> )), чтобы определить дополнительные атрибуты для функций.

  • чистый: доступен только для доступа (но не изменяет) параметров и глобальной памяти. GCC использует эту информацию, чтобы определить, может ли оптимизатор полностью опустить повторные вызовы функции (локальная-memoization). Две заметные чистые функции: strlen и memcmp.

  • const: не путать с С++ const, функции const работают только с параметрами, и эти параметры не должны быть указателями. Это в основном более ограниченная версия pure. Оптимизатор рассматривает функции const так же, как pure. Хотя теоретически он мог бы выполнять более агрессивную (нелокальную) memoization, чем для pure.

Синтаксис нового синтаксиса С++ 11 (§7.6) был предназначен для такого рода вещей. В настоящее время вы не можете использовать синтаксис атрибутов С++ для установки атрибутов GCC, но это изменится в будущих версиях gcc.

Таким образом, вы сможете назначить атрибут pure для функций с использованием синтаксиса атрибутов. Но нет стандартного атрибута pure. pure будет специфичным для компилятора, но он будет делать то же самое на gcc.

Для любопытных, вот список стандартных атрибутов:

  • Выравнивание
  • noreturn
  • <удаp > переопределитьЗабастовкa >
  • <удаp > прячасьЗабастовкa >
  • <удаp > base_checkудаp >
  • carries_dependency