Соответствует ли следующий метод контракту «ограничить»?
void fun(int* restrict foo) {
int* bar = foo + 32;
for (int i = 0; i < 32; ++i)
*bar = 0;
}
Я предполагаю, что нет, но мне нужно некоторое разъяснение.
Соответствует ли следующий метод контракту «ограничить»?
void fun(int* restrict foo) {
int* bar = foo + 32;
for (int i = 0; i < 32; ++i)
*bar = 0;
}
Я предполагаю, что нет, но мне нужно некоторое разъяснение.
Да, это, безусловно, соблюдает контракт.
6.7.3 Определители типа
8 Объект, доступ к которому осуществляется с помощью указателя с указанием
restrict
, имеет специальную связь с этим указателем. Эта ассоциация, определенная в 6.7.3.1 ниже, требует, чтобы все обращения к этому объекту прямо или косвенно использовали значение этого конкретного указателя.135) Предполагаемое использование квалификатора класс хранения) должен способствовать оптимизации, и удаление всех экземпляров квалификатора из всех единиц трансляции предварительной обработки, составляющих соответствующую программу, не меняет его значения (т. е. наблюдаемого поведения).
Короче говоря, в момент определения foo
(вызов функции), foo
программист гарантирует, что это единственный способ сослаться на объекты (если таковые имеются), на которые он указывает.
Таким образом, все другие выражения, относящиеся к этому объекту, должны быть получены из этого значения указателя (например, bar
, которому присвоено значение foo+32
).
Нарушение доверия, как всегда в таких случаях, должным образом наказывается неопределенным поведением.
restrict
в качестве параметров, передача одного и того же адреса обоим будет законной, если ни одна часть объекта, написанная с использованием одного...
- person supercat; 17.08.2015
int* bar = foo + 5; {*bar = 0};
;-) - person Ciro Santilli 新疆再教育营六四事件ۍ   schedule 11.07.2015