Существует ли способ определить тип интеграла/плавания определения типа использования, который не подразумевает искажения?
что-то эквивалентное (кроме примитивной конструкции):
template < typename T >
struct restrict { T* __restrict data; };
как связанный вопрос, действительно ли возможно спросить gcc, что это решает, что псевдоним псевдонима/нет указателя?
Как отмечалось в комментариях, многие новые компиляторы C++ поддерживают реализацию в C99 квалификатора типов ограничений. Поскольку restrict
не является зарезервированным ключевым словом в C++, компиляторы обычно используют __restrict
или __restrict__
. И GCC, и Visual C++ прекрасно документируют это, с явными ссылками на C99.
В стандарте C++ 1998 года говорится, что "спецификатор typedef
не должен... объединяться в decl-specifier-seq с любым спецификатором, кроме type-specifier". По сути, это должен быть список спецификаторов типов, который включает в себя два cv-квалификатора, const
и летучие
.
C99 определяет typedef аналогичным образом, за исключением того, что его список квалификаторов включает restrict
.
Казалось бы, разумно ожидать аналогичной поддержки в типдефах для нестандартного __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.