Ответ 1
Как отмечалось в комментариях, многие новые компиляторы С++ поддерживают реализацию C99 классификатора ограничения. Поскольку restrict
не является зарезервированным ключевым словом в С++, компиляторы обычно используют __restrict
или __restrict__
. Оба GCC и Visual С++ документируют это красиво, с явные ссылки на C99.
В стандарте С++ 1998 указано, что "спецификатор typedef
не должен... объединяться в spec-specifier-seq с любым типом спецификатора, кроме спецификатора типа". По существу, это должен быть список спецификаторов типов, который включает в себя два cv-квалификатора, const
и volatile
.
C99 определяет typedef аналогично, за исключением того, что его список квалификаторов включает restrict
.
Казалось бы разумным ожидать подобную поддержку в typedefs для нестандартного __restrict
... но вы никогда не знаете!
Умный и простой способ проверить это следующим образом:
extern void link_fail();
typedef int *__restrict restricted_int_p;
void test(restricted_int_p a, restricted_int_p b) {
*a = 1;
*b = 2;
if (*a == 2) link_fail();
}
Это просто использует тот факт, что если в объектном файле обнаружен неразрешенный символ link_fail
, компоновщик вызовет ошибку. Если компилятор правильно ограничивает два аргумента, тогда он должен знать значение a
, даже после того, как b
будет изменен. Таким образом, он должен удалить весь блок if из созданного объектного файла, так как он никогда не будет запущен.
Обратите внимание, что хотя GCC поддерживает синтаксис ограничения с по крайней мере версии 3.0, он действительно не выполнял правильную оптимизацию до версия 4.5.