Тип C/С++ __restrict

Есть ли способ определить, используя тип typedef integer/float, который не подразумевает aliasng?

нечто эквивалентное (но примитивная конструкция):

template < typename T >
struct restrict { T* __restrict data; };

как связанный вопрос, можно ли спросить gcc, что он определяет псевдоним/нет псевдонимов указателя?

Ответ 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.