Подтвердить что ты не робот

Что такое внутренности?

Может ли кто-нибудь объяснить, что они собой представляют и почему они мне нужны? Какие приложения я создаю, если мне нужно использовать встроенные функции?

4b9b3361

Ответ 1

Обычно "intrinsics" относится к встроенным функциям - то есть к большинству стандартных функций библиотеки, которые компилятор может/будет генерировать inline вместо вызова фактической функции в библиотеке. Например, вызов типа memset(array1, 10, 0) может быть скомпилирован для x86 как-то вроде:

 mov ecx, 10
 xor eax, eax
 mov edi, offset FLAT:array1
 rep stosb

Искривления, подобные этому, являются чисто оптимизацией. "Необходимые" функции будут, скорее всего, ситуацией, когда компилятор поддерживает встроенные функции, которые позволяют генерировать код, который компилятор не может (или обычно не будет) генерировать напрямую. Для очевидного примера довольно много компиляторов для x86 имеют "MMX Intrinsics", которые позволяют вам использовать "функции", которые на самом деле являются просто прямыми представлениями команд MMX.

Ответ 2

Внутренняя функция - это функция, которую компилятор реализует непосредственно, когда это возможно, вместо привязки к реализуемой библиотекой реализации функции.

Общим примером является strncpy().

Для коротких строк вызов функции strncpy(), включающий настройку "стекового кадра" с обратным адресом, будет потреблять больше времени, чем фактическое копирование байтов. Хуже того, эффект на буферах предварительной выборки процессора остановит выполнение ЦП на несколько тактов.

Вместо этого внутренняя функция реализуется компилятором вместо вызова функции. В примере strncpy() код копирования копируется непосредственно в место, где вызывается strncpy().

Подобно этому примеру strncpy(), каждая внутренняя функция реализуется непосредственно как встроенный код, если требуются ограничения.

Неисследовательная копия внутренней функции обычно существует в стандартной библиотеке, если нужен адрес функции.

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

Короче говоря, практическая разница между встроенной функцией и встроенной функцией заключается в том, что внутренние функции "присутствуют", даже если у вас нет #include нужного файла заголовка, который содержит объявление функции. Для встроенной функции заголовочный файл с объявлением функции должен сначала #include 'd (или иначе объявлен).

Ответ 3

Intrinsics отображаются компилятором как функции, которые сами по себе не являются частью какой-либо библиотеки.

Те из них, которые вы, вероятно, будете использовать больше всего, - это ассемблерные сборки, которые обрабатываются компилятором точно так же, как и машинная команда, которую они представляют. Вы бы использовали их, например, в коде, где вам нужно использовать определенную инструкцию ЦП, которую компилятор не создает автоматически, и где вам необязательно требуется полный встроенный сборник.

Ответ 4

'' Intrinsics '' - это те функции языка, которые компилятор распознает и реализует, не требуя, чтобы программа объявляла их. Компилятор может или не может ссылаться на библиотеку времени выполнения для выполнения операции. Например, в С++ операция копирования структуры неявно:

struct {
    int  a;
    char b [100];
    long c [27];
} s, t;

...
s = t;   // this statement copies hundreds of bytes, likely with a rtl call

Другие примеры включают языки, такие как Fortran, где неявная поддержка сложного типа, а трансцендентные (синус, касательные и т.д.) функции не нужны и не могут быть объявлены. PHP, Javascript, Ruby и т.д. Имеют сотни встроенных функций, таких как создание и поиск массивов, выполнение регулярных выражений и т.д. И т.д.

Что касается ваших других вопросов, единственная разница заключается в том, нужно ли их объявлять. Например, программа на С++, использующая трансцендентные функции, должна включать объявления математической библиотеки:

#include <math.h>

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