Понимание ограничить классификатор на примерах
restrict
ключевое слово'Поведение s определено в C99 6.7.3.1:
Пусть D будет объявлением обычного идентификатора, который обеспечивает средство для обозначения объекта P как ограниченного указателем типа T.
Если D появляется внутри блока и не имеет внешнего класса хранения, пусть B обозначает блок. Если D появляется в списке объявлений параметров определения функции, пусть B обозначает связанный блок. В противном случае пусть B обозначает блок main (или блок любой функции, вызываемой при запуске программы в автономной среде).
В последующем выражение указателя E называется основанным на объекте P, если (в некоторой точке последовательности при выполнении B до оценки E) модифицировать P так, чтобы он указывал на копию объекта массива, на который он ранее указывал изменит значение E.119) Обратите внимание, что ''основан'' определяется только для выражений с типами указателей.
Во время каждого выполнения B пусть L будет любым значением l, которое имеет &L на основе P. Если L используется для доступа к значению объекта X, который он обозначает, и X также модифицируется (любыми средствами), то применяются следующие требования: T не должен быть константным. Каждое другое lvalue, используемое для доступа к значению X, должно также иметь свой адрес на основе P. Каждый доступ, который изменяет X, должен также рассматриваться как модифицирующий P, для целей этого подпункта. Если P присваивается значение выражения указателя E, которое основано на другом объекте ограниченного указателя P2, связанном с блоком B2, то либо выполнение B2 должно начинаться до выполнения B, либо выполнение B2 должно заканчиваться до назначение. Если эти требования не выполняются, то поведение не определено.
Как и всем остальным, мне трудно понять все тонкости этого определения. В качестве ответа на этот вопрос яХотелось бы увидеть множество хороших примеров для каждого требования в 4-м абзаце об использовании, которое будет нарушать это требование. Эта статья:
делает хорошую работу представления правил с точки зрения "компилятор может предположить ... »; Расширение этого паттерна и связывание предположений, которые может сделать компилятор, и того, как они не выдерживают, с каждым примером было бы замечательно.