чисто / константные функции в C ++ 0x - PullRequest
10 голосов
/ 27 сентября 2010

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

  1. Изменилось ли это в C ++ 0x?

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

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

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

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

Ответы [ 2 ]

8 голосов
/ 27 сентября 2010
  1. Изменилось ли это в C ++ 0x?

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

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

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

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

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

6 голосов
/ 28 сентября 2010

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

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

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

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

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

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

  • align
  • noreturn
  • переопределение
  • скрытие
  • base_check
  • carry_dependency
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...