Frage

Hat die statische C-Inline-Funktion zur Laufzeit Identität?

Sollte ich mich um Namenskonflikte dieser Konstrukte kümmern?

Wenn die Funktion in definiert ist .c Datei?Ist es dasselbe?

War es hilfreich?

Lösung

Hat die statische C-Inline-Funktion zur Laufzeit Identität?

Eine statische Inline-Funktion hat innerhalb einer Kompilierungseinheit Identität, wenn der Compiler mindestens einmal entscheidet, sie nicht zu inline, oder wenn Sie die Adresse der Funktion übernehmen.

Die übernommene Adresse ist nur in der aktuellen Kompilierungseinheit gültig (.c Datei).In einer anderen Kompilierungseinheit (einer anderen .c Datei), gibt Ihnen der Compiler eine andere Adresse.

Wie bei jeder anderen Funktion, deren Hauptteil für den Compiler sichtbar ist, kann der Code der Funktion an verschiedenen Stellen im vom Compiler generierten Assemblercode ganz oder teilweise repliziert werden.

Eine statische Inline-Funktion ist (wie jede statische Funktion) für keine andere sichtbar .c Datei als die aktuell kompilierte .c Datei.

Sollte ich mich um Namenskonflikte dieser Konstrukte kümmern?

Nur wenn Sie die Adresse einer statischen Inline-Funktion nehmen, die in einer Header-Datei definiert ist, und Folgendes tun:

  1. Die statische Inline-Funktion f ist in der Datei definiert a.h
  2. a.h ist in C-Dateien enthalten x.c Und y.c
  3. x.c nimmt die Adresse von f und speichert es in einer globalen Variablen f_addr
  4. y.c nimmt die Adresse von f und vergleicht es auf Identität mit dem darin gespeicherten Wert f_addr
  5. Das Ergebnis des Vergleichs wird die false, trotz der Tatsache, dass auf a unterschiedlicher Abstraktionsebene es ist genau die gleiche Funktion f

Wenn die Funktion in der .c-Datei definiert ist?Ist es dasselbe?

Aus Sicht des C-Compilers ist es genau dasselbe, als würde man die Funktion in einer Header-Datei definieren und die Header-Datei in die .c-Datei einbinden.Der Compiler hat keine Ahnung von Header-Dateien, er sieht nur eine kontinuierliche Kompilierungseinheit.Eine Header-Datei ist ein Konzept, das in den Köpfen von Programmierern existiert, die die C-Sprache verwenden – dieses Konzept existiert aus der Sicht des C-Compilers nicht.

Andere Tipps

Die Benennung einer Inline-Funktion ist genauso wichtig wie die Benennung einer Nicht-Inline-Funktion.Der Name wird von verwendet Compiler um zu identifizieren, welche Funktion aufgerufen werden soll.Es wird auch von Programmierern verwendet, die den Code lesen, um zu verstehen, was die Funktion tut.

Zur Laufzeit ist der Name der Funktion nicht relevant.

Beachten Sie auch, dass die inline Schlüsselwort ist nur ein Hinweis an den Compiler.Die Funktion ist möglicherweise nicht tatsächlich inline, obwohl inline Stichwort.Ebenso eine Funktion, die nicht als markiert ist inline ist möglicherweise noch vom Compiler inline.

Namenskonflikte von Inline-Funktionen sind Ihnen vielleicht egal, aber ich garantiere Ihnen, dass der Compiler das tun wird!

Inlining ist ein späterer Vorgang während der Kompilierung – der Compiler muss zunächst die Aufrufstruktur Ihres Programms bestimmen, was erfordert, dass der Compiler alle benannten Aufrufe korrekt auflöst.

Zur Laufzeit können Sie den Namen einer aktuell ausgeführten Funktion nicht kennen, ohne explizit etwas Magie zu programmieren, um ihn zu ermitteln – c ist nicht reflektierend.

Wie Mark betont, ist das Schlüsselwort inline nur ein Hinweis – es steht dem Compiler frei, es zu ignorieren, wenn er entscheidet, dass durch einen expliziten Aufruf eine bessere Leistung erzielt wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top