2010-02-15 15 views
34

Qualcuno può spiegare cosa sono e perché ne avrei bisogno? Che tipo di applicazioni sto costruendo se ho bisogno di usare intrinseche?Quali sono gli intrinsechi?

+0

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

risposta

26

Normalmente, "intrinseco" si riferisce a funzioni che sono built-in - cioè la maggior parte delle funzioni di libreria standard che il compilatore può/genererà in linea invece di chiamare una funzione effettiva nella libreria. Ad esempio, una chiamata del tipo: memset(array1, 10, 0) potrebbe essere compilato per x86 come qualcosa di simile:

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

Intrinsics come questo sono puramente un'ottimizzazione. L'intrinseco "bisogno" intrinseco sarebbe molto probabilmente una situazione in cui il compilatore supporta intrinseche che consentono di generare codice che il compilatore non può (o di solito non vuole) generare direttamente. Per un esempio ovvio, alcuni compilatori per x86 hanno "MMX Intrinsics" che consentono di utilizzare "funzioni" che sono in realtà solo rappresentazioni dirette delle istruzioni MMX.

5

Gli intrinsec sono esposti dal compilatore come funzioni che non fanno parte di alcuna libreria, di per sé.

Quelli che probabilmente usereste di più sono gli intrinseci degli assemblaggi che sono trattati dal compilatore esattamente come l'istruzione macchina che rappresentano. Li useresti, ad esempio, nel codice in cui devi approfittare di una specifica istruzione della CPU che il compilatore non genera automaticamente e dove non richiedi necessariamente una sezione di assemblaggio in linea completa.

+1

caso d'uso: set di istruzioni SIMD (SSE, Altivec, Neon) dove è difficile per i compilatori capire dove utilizzarli, ma i vantaggi dell'assegnazione dei registri/la gestione dello stack frame può ancora essere ottenuta dalla codifica in C anziché da assemblatore –

40

Una funzione intrinseca è una funzione che il compilatore implementa direttamente quando possibile, anziché collegarsi all'implementazione della funzione fornita dalla libreria.

Un esempio comune è strncpy().

Per le stringhe brevi, effettuare una chiamata di funzione a strncpy(), che comporta l'impostazione di un 'stack frame' con un indirizzo di ritorno, consumerà più tempo rispetto alla copia effettiva dei byte. Peggio ancora, l'effetto sui buffer di pre-fetch della CPU bloccherà l'esecuzione della CPU per diversi cicli di clock.

Invece, la funzione intrinseca viene implementata dal compilatore al posto di una chiamata di funzione. Nell'esempio di strncpy(), il codice di copia byte viene emesso direttamente nel punto in cui viene richiamato strncpy().

Simile a questo esempio strncpy(), ogni funzione intrinseca viene implementata direttamente come codice in linea se i vincoli richiesti sono soddisfatti.

Una copia non intrinseca della funzione intrinseca di solito esiste ancora nella libreria standard, nel caso sia necessario l'indirizzo della funzione.

Rispetto alle funzioni inline, la funzione intrinseca viene fornita dal compilatore. Non c'è un posto nel codice sorgente di un programma C in cui è scritta la funzione intrinseca, né esiste un'implementazione di libreria a cui deve essere collegato. Una funzione inline è diversa in quanto il compilatore legge il codice sorgente per la funzione inline, ma è simile al fatto che in seguito potrebbe emettere una traduzione compilata della funzione inline direttamente nel codice oggetto, omettendo il sovraccarico di una chiamata di funzione.

In breve, la differenza pratica tra una funzione intrinseca e una funzione in linea è che le funzioni intrinseche sono "presenti" anche se non si dispone di #include il file di intestazione necessario che contiene la dichiarazione di funzione.Per una funzione inline, il file di intestazione con la dichiarazione della funzione deve essere #include 'd (o altrimenti dichiarato) per primo.

3

'' Intrinsics '' sono quelle caratteristiche di un linguaggio che un compilatore riconosce e implementa senza che sia necessario che il programma li dichiari. Il compilatore può - o non può - collegare a una libreria di runtime per eseguire l'operazione. In C++ per esempio, l'operazione di copia è implicito struttura:

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

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

Altri esempi includono linguaggi come FORTRAN dove c'è supporto implicito per il tipo complesso, e il trascendente (seno, tangente, ecc) funzioni richiedono non- e non può essere dichiarato. PHP, Javascript, Ruby, ecc. Hanno centinaia di funzioni intrinseche come creare e cercare matrici, eseguire corrispondenze di espressioni regolari, ecc.

Come per le altre domande, l'unica differenza è se devono essere dichiarato. Ad esempio, un programma C++ utilizzando funzioni trascendenti deve comprendere matematica dichiarazioni libreria:

#include <math.h> 

Non c'è particolare schema di applicazioni che dipendono intrinsics; questa è solo una questione di significato per scrittori e programmatori di compilatori.

Problemi correlati