cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Добавить ключевое слово restrict в С++ #336

Open apolukhin opened 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +14, -0 Автор идеи: Игорь Шаповал

В С99 было добавлено ключевое слово restrict. Оно применимо только к указателям.

restrict позволяет указать, что объявляемый указатель указывает на блок памяти, на который не указывает никакой другой указатель.

В разных компиляторах уже добавили аналогичные ключевые слова для С++:

GCC: restrict, restrict__

Clang: restrict

Как пример можно посмотреть стандартную функцию std::memcpy

extern void *memcpy (void *__restrict __dest, const void *__restrict __src,
             size_t __n) __THROW __nonnull ((1, 2));

Было бы не плохо иметь в С++ стандартную поддержку.

apolukhin commented 3 years ago

Иван, 5 августа 2018, 16:07 Интересно, в c++ ведь нет встроенных динамических массивов, их приходится реализовывать вручную, на указателях, с ручным управлением памятью. Чтобы сделать это оптимально, нужен этот самый restrict и realloc (Возможность realloc #28). В Си restrict ввели еще в C99. И я так понимаю, есть весомые причины, из-за которых они до сих пор не в стандарте C++?

yndx-antoshkka, 6 августа 2018, 11:47 Иван, но зачем это всё писать самому, если есть std::vector?

Иван, 8 августа 2018, 21:04 yndx-antoshkka, std::vector, если я не ошибаюсь, при вставке в начало и в конец при capacity == size, и при освобождении памяти с начала и с конца, всегда производит переаллокацию. Т.е. работает с памятью очень неэффективно. STL мне впринципе не достаточно...

yndx-antoshkka, 6 августа 2018, 11:57 Работа над этой идеей велась и даже были предложения http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3988.pdf

Последние пару лет работа затихла, люди занимавшиеся проработкой идеи отвлеклись на рефлексию и constexpr.

Если чувствуете в себе силы - посмотрите предложение, постарайтесь его улучшить, и попробуем поторопить события.

Саша Зайцев, 7 августа 2018, 0:32 yndx-antoshkka, я совсем недавно спрашивал на std-proposals о судьбе пропозала - пока что тишина. И на самом деле там довольно много открытых вопросов по поводу restrict. Кому интересно - просто почитайте полностью самый последний на текущий момент proposal по данной теме.

alexey-milovidov commented 3 years ago

Слишком много случаев, когда простое добавление restrict решает проблемы с производительностью: https://github.com/ClickHouse/ClickHouse/pull/19946

Или просто канонический пример, где складываем поэлементно два массива в третий.

А это чуть ли не единственная причина, по которой "из коробки" код на Rust может быть более производительным, чем на C++.

Правда с учётом того, что __restrict работает, предложение в стандарт не так важно. Хотя он работает неудобно - много непонятных случаев.