Подробное, но читаемое объяснение квалификатора ограничения?

Наконец-то я заинтересовался некоторыми функциями C99, и теперь у меня возникли проблемы с пониманием соответствующих разделов проекта C99.

Я знаю, чтоstrict — это обещание, что два ограниченных указателя не будут указывать на один и тот же объект, но мои поиски более подробных и конкретных объяснений того, что разрешено, а что нет, оказались малоэффективными.

Итак, мой вопрос: может ли кто-нибудь предоставить читаемое и понятное объяснение подробностей об указателях ограничения, например. когда я могу и не могу их использовать, когда это УБ и т. д. Чем больше подробностей, тем лучше. Я устал от того, что у меня болит голова, глядя на черновик C99.

Спасибо.


person Subsentient    schedule 16.02.2015    source источник
comment
Может быть полезно: cellperformance.beyond3d.com/articles/2006 /05/   -  person cremno    schedule 16.02.2015
comment
на самом деле «ограничение» — это обещание программиста, что такие операции, как memmov(), не будут накладываться друг на друга даже на один байт. Это позволяет функциям, таким как memmov(), применять несколько оптимизаций, поэтому они выполняются намного быстрее.   -  person user3629249    schedule 16.02.2015
comment
Со ссылкой на документ ISO поиск чего-то более подробного, естественно, будет бесплодным.   -  person Kaz    schedule 16.02.2015
comment
Ваш вопрос слишком широк; вы просите кого-нибудь переписать значительную часть документа ISO в расширенной, аннотированной форме. Сделать это должным образом — важная задача.   -  person Kaz    schedule 16.02.2015
comment
@ user3629249 Зачем упоминать *memmove(void *s1, const void *s2, size_t n)? Вы имели в виду *memcpy(void * restrict s1, const void * restrict s2, size_t n)?   -  person chux - Reinstate Monica    schedule 17.02.2015


Ответы (1)


вот выдержка из: http://en.wikipedia.org/wiki/Restrict

относительно модификатора «ограничить»

«В языке программирования C, согласно стандарту C99, ограничение — это ключевое слово, которое можно использовать в объявлениях указателя. Ключевое слово ограничения — это объявление намерения, данное программистом компилятору. , то для доступа к объекту, на который он указывает, будет использоваться только он или значение, непосредственно полученное из него (например, указатель + 1). Это ограничивает эффекты алиасинга указателя, помогая оптимизации. Доступ к объекту осуществляется с помощью независимого указателя, это приведет к неопределенному поведению. Использование ключевого слова limited в C, в принципе, позволяет нетупому C достичь той же производительности, что и та же программа, написанная на Fortran.

person user3629249    schedule 16.02.2015
comment
Это описание не совсем верное. Ограничение применяется не к объектам, на которые указывает указатель, а скорее к объектам, к которым доступ осуществляется с помощью этого указателя или производного указателя. Кроме того, это применимо только к объектам, которые записываются в какой-то момент времени жизни указателя. Объект может быть прочитан как с использованием квалифицированного указателя restrict, так и другими способами, если он не записан. - person supercat; 10.03.2017