2016-09-09 3 views
0

Es ist allgemein bekannt, dass der Compiler bei Inline-Funktionen, wenn sie aufgerufen werden, den eigentlichen Aufruf der Funktion durch ihren Körper "ersetzt".Semantik der Inline-Variablen

Aber was ist mit Inline-Variablen in C++ 17 vorgeschlagen? Was sind ihre Semantiken?

Antwort

1

Normalerweise müssen Funktionen und Variablen (Platz für eine Variable oder der Code für einen Funktionskörper) genau einmal definiert werden. Inline-Funktionen lockern das, um mehrere Definitionen zu ermöglichen (da die Definitionen durch Include-Dateien in mehrere Module gezogen werden), die alle identisch sein müssen. Wenn die Funktion tatsächlich referenziert wird und nicht in-line kopiert wird, werden die mehreren Definitionen zusammengeführt, indem alle bis auf eine Kopie verworfen werden und diese Kopie die offizielle Kopie in der Binärdatei wird.

Inline-Variablen machen das Äquivalent für zB. statische Klassenmitglieder. Anstatt eine Quelltextdatei für den Klassenkörper zu erstellen, deren einziger Inhalt die Definition der einzelnen Elementvariablen wäre, könnten Sie die statische Elementvariable in der Klassenheaderdatei und die resultierenden Mehrfachdefinitionen definieren (eine in jedem Modul, die enthalten ist) Der Klassenheader würde in einer einzigen Instanz in der Binärdatei zusammengeführt, ohne Compiler- oder Linkerfehler zu verursachen.

This paper discusses it in technical detail.

4

Nein, es gibt keine Garantie, dass der Aufruf einer Inline-Funktion tatsächlich dazu führt, dass die Funktion inline ausgeführt wird. Wenn sich die Inline-Funktion beispielsweise rekursiv selbst aufruft, wird sie wahrscheinlich nicht inline sein. Ebenso können Aufrufe durch eine Funktionszeigervariable oft nicht inline ausgeführt werden.

Wenn eine Inline-Funktion externe Bindung hat, dann während der Verknüpfung, wenn die Inline-Funktion in mehreren Übersetzungseinheiten definiert ist, wählt der Linker eine der Übersetzungseinheiten, die Definition enthalten, und löst alle verbleibenden Referenzen (dh odr - verwendet vom Compiler nicht inlined) zu dieser Funktion der Definition in der gewählten Übersetzungseinheit, wobei die übrigen Definitionen verworfen werden. Inline-Variablen funktionieren auf die gleiche Weise.