Бесполезный случай для ограничения

Насколько я понимаю, стандарт C99 предписывает, чтобы указатели на разные типы не имели псевдонимов (т.е. указывали на одну и ту же память). Ключевое слово restrict гарантирует компилятору, что две определенные переменные (одного и того же типа?) не находятся в одном и том же слоте памяти.

Таким образом, верно ли, что следующая функция не принесет пользы от ключевого слова restrict?

void sphere_intersect(float* t, const sphere* s, const ray* r); 

Но такая функция будет:

void vector_add(vector* v, const vector* u);

person Daniel Lovasko    schedule 29.08.2017    source источник
comment
Даже указатели на одинаковые типы данных restricted. См., например, strcpy.   -  person Unmanned Player    schedule 30.08.2017
comment
На самом деле, единственный смысл restrict — сообщить компилятору, что указатели разные и не должны иметь псевдонимов. Неважно, какие типы используются.   -  person Unmanned Player    schedule 30.08.2017
comment
@UnmannedPlayer не предполагает ли уже компилятор (если вы компилируете с -fstrict-aliasing), что указатели на разные типы не имеют псевдонима? Поэтому ключевое слово limited имеет смысл только для того, чтобы помочь компилятору с одинаковыми типами.   -  person Daniel Lovasko    schedule 30.08.2017
comment
Если какой-либо из указателей является указателем на символьные данные, правила псевдонимов не применяются, но restrict помогает компилятору узнать, что отдельные указатели указывают на отдельные данные.   -  person Jonathan Leffler    schedule 30.08.2017
comment
указатели на разные типы не имеют псевдонимов Нет, это сложнее, и, в конце концов, никто не согласен с тем, что на самом деле означает отсутствие псевдонимов; за исключением каламбура с четким шрифтом, когда вы пишете int, а затем читаете float в том же месте.   -  person curiousguy    schedule 06.09.2017


Ответы (1)


Функция вроде

void sphere_intersect(float* t, const sphere* s, const ray* r);

было бы полезно добавить ограничение, если типы sphere и/или ray содержат какие-либо поля float. При отсутствии restrict компилятор должен предположить, что t может быть псевдонимом с любым полем float в объектах, на которые указывает s или r. Таким образом, любая запись в *t может изменить такое поле, что означает, что компилятор не сможет хранить значение указанного поля в регистре для последующего повторного использования, а вместо этого должен будет перезагрузить его.

person Chris Dodd    schedule 30.08.2017
comment
Я думаю, что этот ответ следует принять. Возможно, дополнительный вопрос: давайте предположим, что в этой функции нет float* t, только sphere* s и ray* r. Они оба содержат только поля с плавающей запятой - стоит ли добавлять квалификатор restrict, пожалуйста? - person Daniel Lovasko; 30.08.2017