Ситуация с ключевым словом / атрибутом `restrict` в стандарте C ++ - PullRequest
8 голосов
/ 24 мая 2019

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

В настоящее время ключевое слово restrict является только частью C99, но не частью C ++.Мы знаем, что многие компиляторы C ++ поддерживают __restrict__ как расширение.Этот вопрос также подробно рассказывает о том, что restrict и __restrict__ делают.

Теперь обсуждение в вышеупомянутом вопросе произошло давно и не говорит о C ++ 17, C++ 20, ни планов на будущие стандарты.Я нашел n3988 предложение , в котором обсуждаются restrict -подобные псевдонимы в C ++, сложности с более богатым синтаксисом в C ++ и потенциальные способы их устранения.

Согласно блогу IBM (2014), N3988 был рекомендован для дальнейшей работы .

Этот вопрос рассказывает об истории restrict и C ++ без каких-либо окончательных выводов относительно фактической реализации и упоминает статьи, которые я уже перечислил, или , упомянутый в комментариях (p1296) .

Мне не удалось найти ничего кроме этого в планах поддержки restrict в будущем C ++ (насколько я знаю, это не часть C ++ 17).Это кажется очень полезной функциональностью, поэтому мне интересно,

  • , если я что-то упустил в плане предложений / обсуждения?
  • Есть ли другая информация об использовании restrict в C ++?
  • существуют ли альтернативные способы сделать оптимизацию компилятора (разрешенной __restrict__) возможной, используя только "стандартную" функциональность?

1 Ответ

6 голосов
/ 24 мая 2019

Ничего похожего на C restrict нет даже в C ++ 20. Документ , уже упомянутый , был хорошо принят на предварительной презентации в ноябре 2018 года, возможно, потому, что он избегает критических трудностей с классификатором - никто, даже в C, не понимает, как он взаимодействует с остальными система типов. Частично это связано с тем, что добавление restrict не меняет значения какого-либо одного указателя, но влияет на его связь с некоторым набором других указателей (чье членство не указано точно) на основе того, какая арифметика выполняется с ними позже. Другая часть заключается в том, что C ++ допускает так много операций с типами: что будет означать std::vector<T *restrict>, и какой будет тип индексации std::vector<T> &restrict?

Пока неясно, какую практическую возможность оптимизации предложит такой контрактный подход; Есть еще много вопросов без ответа о контрактах и ​​оптимизации в целом.

...