Что означает внутренняя #pragma? - PullRequest
7 голосов
/ 20 апреля 2011

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

Ответы [ 4 ]

4 голосов
/ 20 апреля 2011

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

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

A.более совместим с оптимизаторами и
B. более согласован с языком по сравнению с использованием встроенной сборки.

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

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

1 голос
/ 20 апреля 2011

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

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

0 голосов
/ 20 апреля 2011

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

Если реализация не распознает «встроенный» токен предварительной обработки, прагма игнорируется.
Еслиреализация распознает, что бы ни было определено, произойдет (и если другая реализация определит это по-другому, в другой реализации произойдет другое).

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

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

0 голосов
/ 20 апреля 2011

Внутренняя прагма сообщает компилятору, что функция имеет известное поведение.Компилятор может вызывать функцию и не заменять вызов функции встроенными инструкциями, если это приведет к улучшению производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...