restrict (C++ AMP)

Спецификатор ограничения может применяться к объявлениям функций и лямбда-выражений. Он реализует ограничения на код функции и на ее поведение в приложениях, в которых используется среда выполнения C++ AMP.

Примечание.

Сведения о restrict ключевое слово, которая является частью __declspec атрибутов класса хранилища, см. в разделе "Ограничение".

Предложение restrict принимает следующие формы:

Предложение Description
restrict(cpu) В функции могут использоваться все возможности языка C++. Вызывать ее могут только другие функции, объявленные с помощью функции restrict(cpu).
restrict(amp) В функции может использоваться только то подмножество языка C++, выполнение которого может ускорить C++ AMP.
Последовательность функций restrict(cpu) и restrict(amp). Функция должна соблюдать ограничения, устанавливаемые обеими функциями: и restrict(cpu), и restrict(amp). Вызывать ее могут функции, объявленные при помощи restrict(cpu), restrict(amp), restrict(cpu, amp) или restrict(amp, cpu).

Форма restrict(A) restrict(B) может быть записана в виде restrict(A,B).

Замечания

Ключевое слово restrict — это контекстная ключевое слово. Спецификаторы ограничения cpu и amp не являются зарезервированными словами. Список спецификаторов не может быть расширен. Функция, которая не имеет предложения, совпадает с функцией, которая имеет restrictrestrict(cpu) предложение.

Для функции с предложением restrict(amp) действуют следующие ограничения:

  • Функция может вызывать только функции с предложением restrict(amp).

  • Функция должна поддерживать подстановку.

  • Функция может объявлять только intunsigned intпеременные и floatпеременные, а double также классы и структуры, содержащие только эти типы. bool также допускается, но он должен быть выровнен по 4 байтам, если он используется в составном типе.

  • Лямбда-функции не могут захватывать по ссылке и не могут захватывать указатели.

  • Указатели с одним косвенным обращением и ссылки поддерживаются только как локальные переменные, аргументы функций и типы возвращаемых значений.

  • Следующие возможности не допускаются:

    • Рекурсия.

    • Переменные, объявленные с переменным ключевое слово.

    • Виртуальные функции.

    • Указатели на функции.

    • Указатели на функции-члены.

    • Указатели в структурах.

    • Указатели на указатели.

    • Инструкцииgoto .

    • Операторы с метками.

    • try, catchили throw операторы.

    • Глобальные переменные.

    • Статические переменные. Вместо этого используйте ключевое слово tile_static.

    • dynamic_cast Бросает.

    • Оператор typeid.

    • Объявления asm.

    • Использование vararg.

Обсуждение ограничений функций см. в разделе "Ограничения (amp)".

Пример

В следующем примере показано, как использовать restrict(amp)предложение.

void functionAmp() restrict(amp) {}
void functionNonAmp() {}

void callFunctions() restrict(amp)
{
    // int is allowed.
    int x;
    // long long int is not allowed in an amp-restricted function. This generates a compiler error.
    // long long int y;

    // Calling an amp-restricted function is allowed.
    functionAmp();

    // Calling a non-amp-restricted function is not allowed.
    // functionNonAmp();
}

См. также

C++ AMP (C++ Accelerated Massive Parallelism)