Was sind Intrinsic?

Lesezeit: 4 Minuten

Benutzeravatar von Scott J
Scott J

Kann mir jemand erklären, was sie sind und warum ich sie brauche? Welche Art von Anwendungen erstelle ich, wenn ich Intrinsics verwenden muss?

Benutzeravatar von Heath Hunnicutt
Heide Hunnicutt

Eine intrinsische Funktion ist eine Funktion, die der Compiler nach Möglichkeit direkt implementiert, anstatt mit einer von der Bibliothek bereitgestellten Implementierung der Funktion zu verknüpfen.

Ein gängiges Beispiel ist strncpy().

Für kurze Strings einen Funktionsaufruf machen strncpy(), die das Einrichten eines “Stapelrahmens” mit einer Rücksprungadresse beinhaltet, wird mehr Zeit in Anspruch nehmen als das eigentliche Kopieren von Bytes. Schlimmer noch, die Auswirkung auf die CPU-Vorabrufpuffer hält die CPU-Ausführung für mehrere Taktzyklen an.

Stattdessen wird die intrinsische Funktion vom Compiler anstelle eines Funktionsaufrufs implementiert. Im Beispiel von strncpy()wird der Byte-Kopiercode direkt an der Stelle ausgegeben, wo strncpy() wird aufgerufen.

Ähnlich wie dies strncpy() Beispielsweise wird jede intrinsische Funktion direkt als Inline-Code implementiert, wenn die erforderlichen Einschränkungen erfüllt sind.

Eine nicht-intrinsische Kopie der intrinsischen Funktion ist normalerweise noch in der Standardbibliothek vorhanden, falls die Adresse der Funktion benötigt wird.

Im Gegensatz zu Inline-Funktionen wird die intrinsische Funktion vom Compiler bereitgestellt. Im Quellcode eines C-Programms gibt es keine Stelle, an der die intrinsische Funktion geschrieben ist, und es gibt auch keine Bibliotheksimplementierung, auf die gelinkt werden muss. Eine Inline-Funktion unterscheidet sich darin, dass der Compiler den Quellcode für die Inline-Funktion liest, ist aber insofern ähnlich, als er später eine kompilierte Übersetzung der Inline-Funktion direkt in den Objektcode ausgeben kann, wodurch der Overhead eines Funktionsaufrufs weggelassen wird.

Kurz gesagt, der praktische Unterschied zwischen einer intrinsischen Funktion und einer Inline-Funktion besteht darin, dass intrinsische Funktionen “vorhanden” sind, auch wenn Sie es nicht haben #include die benötigte Header-Datei, die die Funktionsdeklaration enthält. Für eine Inline-Funktion muss die Header-Datei mit der Funktionsdeklaration sein #include‘d (oder anders erklärt) zuerst.

Normalerweise bezieht sich “intrinsisch” auf Funktionen, die eingebaut sind – dh die meisten Standardbibliotheksfunktionen, die der Compiler inline generieren kann/wird, anstatt eine tatsächliche Funktion in der Bibliothek aufzurufen. Zum Beispiel ein Anruf wie: memset(array1, 10, 0) könnte für ein x86 wie folgt kompiliert werden:

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

Intrinsics wie diese sind eine reine Optimierung. „Bedarf“ von Intrinsic ist höchstwahrscheinlich eine Situation, in der der Compiler Intrinsic unterstützt, mit der Sie Code generieren können, den der Compiler nicht direkt generieren kann (oder normalerweise nicht). Als offensichtliches Beispiel haben einige Compiler für x86 “MMX Intrinsics”, mit denen Sie “Funktionen” verwenden können, die wirklich nur direkte Darstellungen von MMX-Anweisungen sind.

Intrinsics werden vom Compiler als Funktionen bereitgestellt, die nicht Teil einer Bibliothek sind. an sich.

Die, die Sie wahrscheinlich am häufigsten verwenden würden, sind Montage-Intrinsik die vom Compiler genau als die Maschinenanweisung behandelt werden, die sie darstellen. Sie würden sie beispielsweise in Code verwenden, in dem Sie eine bestimmte CPU-Anweisung nutzen müssen, die der Compiler nicht automatisch generiert, und in dem Sie nicht unbedingt einen vollständigen Inline-Assembly-Abschnitt benötigen.

  • Anwendungsfall: SIMD-Befehlssätze (SSE, Altivec, Neon), bei denen es für Compiler schwierig ist, herauszufinden, wo sie verwendet werden sollen, aber die Vorteile der Registerzuweisung/Stack-Frame-Verwaltung können immer noch durch die Codierung in C im Gegensatz zu Assembler erzielt werden

    – centaurian_slug

    27. November 2011 um 4:24 Uhr

„Intrinsics“ sind jene Merkmale einer Sprache, die ein Compiler erkennt und implementiert, ohne dass das Programm sie deklarieren muss. Der Compiler kann – oder auch nicht – eine Verknüpfung zu einer Laufzeitbibliothek herstellen, um die Operation auszuführen. In C++ zum Beispiel ist der Kopiervorgang der Struktur implizit:

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

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

Andere Beispiele sind Sprachen wie Fortran, in denen der komplexe Typ implizit unterstützt wird und die transzendenten Funktionen (Sinus, Tangens usw.) nicht deklariert werden müssen – und können. PHP, Javascript, Ruby usw. verfügen über Hunderte von intrinsischen Funktionen, z. B. zum Erstellen und Durchsuchen von Arrays, zum Durchführen von Übereinstimmungen mit regulären Ausdrücken usw. usw.

Bei Ihren anderen Fragen besteht der einzige Unterschied darin, ob sie deklariert werden müssen. Beispielsweise muss ein C++-Programm, das transzendente Funktionen verwendet, mathematische Bibliotheksdeklarationen enthalten:

#include <math.h>

Es gibt kein bestimmtes Muster von Anwendungen, die von Eigenheiten abhängen; das ist nur für Compiler-Autoren und Programmierer von Bedeutung.

1418920cookie-checkWas sind Intrinsic?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy