2010-02-15 4 views
34

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

+0

http://en.wikipedia.org/wiki/Intrinsic_function – sellibitze

ответ

26

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

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

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

5

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

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

+1

прецедент: наборы команд SIMD (SSE, Altivec, Neon), где компиляторам сложно определить, где их использовать, но преимущества распределения регистров/управление кадрами стека все еще может быть получено из кодирования в C, в отличие от ассемблера –

40

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

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

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

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

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

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

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

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

3

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

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

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

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

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

#include <math.h> 

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

Смежные вопросы