Если у меня есть функция-член, объявленная так:
double* restrict data(){
return m_data; // array member variable
}
может ли ключевое слово restrict сделать что-нибудь?
По-видимому, с g ++ (архитектура x86) это не может, но есть ли другие компиляторы / архитектуры, в которых этот тип конструкции имеет смысл и позволил бы оптимизировать генерацию машинного кода?
Я спрашиваю, потому что библиотека Blitz (Blitz ++) имеет целый ряд функций, объявленных таким образом, и не имеет смысла, чтобы кто-то входил и добавлял ключевое слово restrict, если он на самом деле что-то не делает. Поэтому, прежде чем я пойду и уберу restrict
(чтобы избавиться от предупреждений компилятора) Я хотел бы знать, как я злоупотребляю кодом.
КАКИЕ restrict
Мы говорим о?
restrict
в настоящее время является нестандартным … это означает, что это расширение компилятора; он непереносим в том смысле, что Стандарт C ++ не предписывает его существования, и в нем нет никакого официального текста, который говорит нам, что он должен делать.
restrict
в настоящее время зависит от компилятора C ++, и нужно обратиться к документации по компилятору по своему выбору, чтобы увидеть, что именно он делает.
НЕКОТОРЫЕ МЫСЛИ
Есть много статей об использовании restrict
, среди них:
В нескольких местах намекнули, что цель restrict
состоит в том, чтобы квалифицировать указатели так, чтобы компилятор знал, что два указателя в одной и той же области не относятся к одной и той же области памяти.
Имея это в виду, мы можем легко увидеть, что возвращаемый тип не имеет потенциала столкновение с другими указателями, поэтому использование его в таком контексте, как правило, не дает никаких возможностей для оптимизации. Тем не мение; один должен обратитесь к документированному поведению используемой реализации, чтобы знать наверняка .. как указано: restrict
не является стандартным, еще.
Я также нашел следующую ветку, где разработчики Блиц ++ обсуждает удаление strict
применяется к типу возврата функции, так как она ничего не делает:
МАЛЕНЬКАЯ ЗАПИСКА
В качестве дальнейшего примечания, вот что Документация LLVM говорит о noalias
против restrict
:
Для значений, возвращаемых функцией, ограничение C99 не имеет смысла, в то время как LLVM — noalias.
Общий ограничитель квалификатора может только помочь лучше оптимизировать код. Удаляя «ограничение», вы ничего не нарушаете, но когда вы добавляете это без заботы, вы можете получить некоторые ошибки. Отличным примером является разница между memcpy и memmove. Вы всегда можете использовать более медленный memmove, но вы можете использовать более быстрый memcpy, только если вы знаете, что src и dst не перекрываются.