C/C++ __ ограничивает тип

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

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

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

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

11
задан Nicol Bolas 2 August 2012 в 18:18
поделиться

1 ответ

Как отмечалось в комментариях, многие новые компиляторы 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.

20
ответ дан 3 December 2019 в 05:57
поделиться