Функции pure/const в С++ 0x
В С++ 98/С++ 03 в языке нет ключевых слов функции pure/const.
-
Изменилось ли это в С++ 0x?
-
Если да, можно ли установить такой флаг даже на объектах функции (std::function
)? Поэтому я могу передать некоторые функции указателя или лямбда-функции, а также дать информацию о том, что это чистая/const-функция? Вызываемая функция может иметь оптимизированный путь выполнения для такой функции.
-
Есть ли способ проверить, является ли данная функция чистой /const? То есть например, если на std::function
есть такой флаг, как описано выше, я, вероятно, могу просто проверить этот флаг. Но, возможно, есть даже более общий способ.
Если он не изменился, почему бы и нет? Я думаю, что было бы очень полезно иметь такую поддержку.
Есть ли открытые предложения об этом?
Ответы
Ответ 1
Нет. Существует 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