Что такое intrinsics?

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

52
задан plasmacel 4 January 2017 в 04:36
поделиться

4 ответа

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

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

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

41
ответ дан 7 November 2019 в 09:18
поделиться

YUI Doc является языковым агностиком. Его можно использовать. Вот видео, описывающее его использование: http://developer.yahoo.com/yui/theater/video.php?v=woods-yuiconf2009-yuidoc

-121--1620372-

Декоратор cache_page будет использовать CacheMiddleware в конце концов, который создаст ключ кэша на основе запроса (см. django.utils.cache.get _ cache _ key ) и key_prefix («блог» в вашем случае). Обратите внимание, что «блог» - это только префикс, а не весь ключ кэша.

При сохранении комментария можно получить уведомление по сигналу post_save джанго , затем попытаться создать ключ кэша для соответствующей страницы (страниц) и, наконец, сказать cache.delete (ключ) .

Однако для этого требуется cache_key, который создается с запросом на ранее кэшированное представление. Этот объект запроса недоступен при сохранении комментария. Можно создать ключ кэша без соответствующего объекта запроса, но эта конструкция происходит в функции, помеченной как частная ( _ создать _ cache _ header _ key ), поэтому использовать эту функцию напрямую не предполагается. Тем не менее, вы можете построить объект, который имеет атрибут пути, который тот же, что и для исходного кэшированного представления, и Джанго не заметил бы, но я не рекомендую это.

cache_page decorator абстрагирует кэширование совсем немного для вас и затрудняет удаление определенного объекта кэша напрямую. Вы можете составить собственные ключи и обрабатывать их в том же пути, но это требует дополнительного программирования и не так абстрактно, как кэш _ страница декоратор.

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

Подводя итог: Django делает срок действия ключей кэша на основе времени для вас, но пользовательское удаление ключей кэша в нужное время более сложное.

-121--1158670-

Внутренние данные представлены компилятором как функции, не входящие в состав библиотеки per se .

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

6
ответ дан 7 November 2019 в 09:18
поделиться

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

Типичный пример - strncpy () .

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

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

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

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

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

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

55
ответ дан 7 November 2019 в 09:18
поделиться

«Внутренние функции» - это те особенности языка, которые компилятор распознает и реализует без необходимости их объявления в программе. Компилятор может - или не может - связываться с библиотекой времени выполнения для выполнения операции. В 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

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

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

#include <math.h>

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

2
ответ дан 7 November 2019 в 09:18
поделиться