После прочтения стандарта C, 6.7.3.1 «Формальное определение restrict
», у меня возникло следующее недоразумение. Интересно, следующий код мгновенно вызывает неопределенное поведение:
void foo(int *restrict p) {
int *restrict q = p;
}
Понятно, что q
присваивается значение, основанное на другом ограниченном указателе p
. Неясно, связаны ли эти два указателя с одним и тем же блоком (самой функцией) или с разными блоками (p
с самой функцией, q
с телом составного оператора), потому что, например.
int *restrict p;
{
int *restrict q = p;
}
не вызывает неопределенного поведения (можно создавать псевдонимы указателей в подблоках).
Верхний ответ в MSVC++ ограничивает ключевое слово и локальные переменные предполагает, что int *restrict q = p + 1;
подойдет , однако [по крайней мере, в случае стандарта C] это неверно, потому что выражение p + 1
по-прежнему основано на p
.
Определение блока находится в 6.7.3.1 p2:
- Если [объявление определенного указателя]
D
появляется внутри блока и не имеет класса храненияextern
, пустьB
обозначить блок. ЕслиD
появляется в списке объявлений параметров определения функции, пустьB
обозначает соответствующий блок. [...]
Так является ли «связанный блок» функции тем же самым, что и тело функции в этом контексте? Потому что я не сразу нашел какое-либо объяснение термина «связанный блок» ранее в тексте.
restrict
. внутри функции. Полагаться на что-то еще, кроме стандарта для таких деталей, вообще плохая идея. И, в частности, известно, что MS плохо следует стандарту C (они даже не поддерживают предыдущую версию стандарта, C99). - person too honest for this site   schedule 29.01.2016restrict
параметрами функций кажется мне неразумным. - person too honest for this site   schedule 29.01.2016restrict
это C99 и (как я уже упоминал) редко используется (будь то лень или незнание как FUZxxI). Это не вредно для использования, но я сомневаюсь, есть ли какая-то польза, кроме потенциального получения предупреждения о нарушении (хотя я бы не стал полагаться на его получение). Все это не относится к внешнему интерфейсу. - person too honest for this site   schedule 12.07.2016restrict
и т. д.restrict
на самом деле является хаком из-за отсутствия стандартизированной передачи такой информации от компилятора к компоновщику автоматически. - person too honest for this site   schedule 12.07.2016