Ескерім
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Спецификатор ограничения может применяться к объявлениям функций и лямбда-выражений. Он реализует ограничения на код функции и на ее поведение в приложениях, в которых используется среда выполнения 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
не являются зарезервированными словами. Список спецификаторов не может быть расширен. Функция, которая не имеет предложения, совпадает с функцией, которая имеет restrict
restrict(cpu)
предложение.
Для функции с предложением restrict(amp)
действуют следующие ограничения:
Функция может вызывать только функции с предложением
restrict(amp)
.Функция должна поддерживать подстановку.
Функция может объявлять только
int
unsigned 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();
}