Что означает #pragma intrinsic?

просто хотите знать, что означает #pragma intrinsic (_m_prefetchw)?

4 ответов


насколько мне известно, похоже, кто-то намеревался изменить некоторые настройки MSVC++. Однако этот параметр не является допустимым для параметра внутренняя ПРАГМА. _m_prefetchw С другой стороны-теперь в 3D! встроенная функция.

Как и все встроенные функции компилятора, он предоставляет (возможно) более быстрые инструкции по сборке, поддерживаемые базовым оборудованием, вашему приложению C или c++ способом

А. более последовательным с оптимизаторами, и
B. Более совместимый с языком, при сравнении с использованием встроенной сборки.

в MSVC в системах x86_64/x64/amd64 встроенная сборка не поддерживается, поэтому для доступа к функциям whizzbang базового оборудования необходимо использовать такие встроенные компоненты.

наконец, следует отметить, что _m_prefetchw теперь это 3D! внутренняя и 3D сейчас! поддерживается только на оборудовании AMD. Это не то, что вы хотите использовать для нового кода (т. е. вместо этого вы должны использовать SSE, который работает как на оборудовании Intel, так и на AMD и имеет больше возможностей для загрузки).


значение " # pragma intrinsic "(Note spelling), как и во всех директивах" #pragma", варьируется от одного компилятора к другому. Как правило, это указывает на то, что определенная вещь, которая выглядит синтаксически как вызов внешней функции, должна быть заменена некоторым встроенным кодом. В некоторых случаях, это может значительно повысить производительность, особенно если компилятор может определить значения констант для некоторых или всех аргументов (в последнем случае компилятор может вычислить значение функции и заменить его константой).

Как правило, наличие функций, обработанных как встроенные, не будет представлять какой-либо конкретной проблемы. Самая большая опасность заключается в том, что если пользователь определяет в одном модуле функцию с тем же именем, что и одна из внутренних функций компилятора, и пытается вызвать эту функцию из другого модуля, компилятор может вместо этого заменить вызов функции ожидаемой последовательностью инструкций. Чтобы предотвратить это, некоторые компиляторы не позволяют внутренние функции по умолчанию (поскольку это приведет к вышеуказанной несовместимости с некоторыми программами, соответствующими стандарту), но предоставляют директивы #pragma для их включения. Компиляторы также могут использовать опцию командной строки для включения встроенных функций (поскольку стандарт позволяет что-либо там) или могут определять некоторые функции, такие как __memcpy () как встроенные и внутри строки.h, используйте директиву #define для преобразования memcpy в _ _ memcpy (поскольку программы, которые #включают строку.h не разрешается использовать memcpy для любых других цель.)


на C, Это зависит от того, распознает ли реализация (и определяет) ее.

если реализация не распознает "внутренний" токен предварительной обработки, то ПРАГМА игнорируется.
Если реализация признает это, произойдет все, что определено (и если другая реализация определяет это по-другому, другая вещь происходит на другой реализации).

проверьте документацию для реализации, о которой ты говоришь (edit: и не используйте его, если вы ожидаете скомпилировать свой источник в разных реализациях).

Я не смог найти ссылку на "# pragma intrinsic " в man gcc на моей системе.


внутренняя ПРАГМА указывает компилятору, что функция имеет известное поведение. Компилятор может вызвать функцию и не заменять вызов функции встроенными инструкциями, если это приведет к повышению производительности.

источник:http://msdn.microsoft.com/en-us/library/tzkfha43 (VS.80).aspx