Intrinseci del compilatore
La maggior parte delle funzioni sono contenute nelle librerie, ma alcune sono incorporate (ovvero intrinseche) al compilatore. Queste sono denominate funzioni intrinseche o intrinseci.
Osservazioni:
Se una funzione è intrinseca, il codice per la funzione viene in genere inserito inline, evitando, in questo modo, il sovraccarico di una chiamata di funzione e consentendo la creazione di istruzioni del computer estremamente efficaci per tale funzione. Un intrinseco è spesso più veloce dell'assembly inline equivalente, in quanto l'utilità di ottimizzazione dispone di una conoscenza incorporata del comportamento di molti intrinseci, pertanto possono essere disponibili ottimizzazioni altrimenti non disponibili quando si usa l'assembly inline. Inoltre, l'utilità di ottimizzazione può espandere la funzione intrinseca in modo diverso, allineare i buffer in modo differente o apportare altre modifiche a seconda del contesto e degli argomenti della chiamata.
L'uso degli intrinseci influisce sulla portabilità del codice, poiché gli intrinseci disponibili in Visual C++ potrebbero non essere disponibili se il codice viene compilato con altri compilatori e alcuni intrinseci che potrebbero essere disponibili per alcune architetture di destinazione non lo sono per tutte le architetture. Tuttavia, gli intrinseci sono in genere più portabili degli assembly inline. Gli intrinseci sono richiesti nelle architetture a 64 bit quando l'assembly inline non è supportato.
Alcune funzioni intrinseche, ad esempio __assume
e __ReadWriteBarrier
, forniscono informazioni al compilatore che influiscono sul comportamento dell'utilità di ottimizzazione.
Alcune funzioni intrinseche sono disponibili solo come intrinseci e alcune sono disponibili nelle implementazioni sia di intrinseci che di funzione. È possibile indicare al compilatore di usare l'implementazione di intrinseci in due modi, a seconda che si voglia abilitare solo funzioni specifiche o abilitare tutte le funzioni intrinseche. Il primo modo consiste nell'usare #pragma intrinsic(
intrinsic-function-name-list)
. Il pragma può essere usato per specificare uno o più intrinseci separati da virgole. Il secondo consiste nell'usare l'opzione del compilatore /Oi (Genera funzioni intrinseche), che rende disponibili tutte le funzioni intrinseche in una determinata piattaforma. In /Oi usare #pragma function(
intrinseco-function-name-list)
per forzare l'uso di una chiamata di funzione anziché un intrinseco. Se la documentazione relativa a note intrinseche specifiche che la routine è disponibile solo come intrinseco, l'implementazione intrinseca viene usata indipendentemente dal fatto che /Oi o #pragma intrinsic
sia specificato. In tutti i casi, /Oi o #pragma intrinsic
consente, ma non forza, l'ottimizzatore per l'uso dell'intrinseco. L'utilità di ottimizzazione potrà ancora chiamare la funzione.
Alcune funzioni di libreria standard C/C++ sono disponibili nelle implementazioni intrinseche in alcune architetture. Quando si chiama una funzione CRT, l'implementazione intrinseca viene usata se /Oi viene specificato nella riga di comando.
È disponibile un file di intestazione, <intrin.h>, che dichiara prototipi per le funzioni intrinseche comuni. Gli intrinseci specifici del <produttore sono disponibili nei file di intestazione immintrin.h> e <ammintrin.h> . Inoltre, alcune intestazioni di Windows dichiarano funzioni che eseguono il mapping su un intrinseco del compilatore.
Le sezioni seguenti elencano tutti gli intrinseci disponibili in varie architetture. Per altre informazioni sull'uso degli intrinseci su un particolare processore di destinazione, fare riferimento alla documentazione di riferimento del produttore.
Vedi anche
Informazioni di riferimento per l'assembler ARM
Informazioni di riferimento su Microsoft Macro Assembler
Parole chiave
Informazioni di riferimento sulla libreria di runtime C