Namespaces
Variants

inline specifier

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Das inline -Spezifizierer, wenn verwendet in der Deklarator-Spezifizierer-Sequenz einer Funktion, deklariert die Funktion als eine Inline-Funktion .

Eine vollständig innerhalb einer Klassen-/Struktur-/Union-Definition definierte Funktion, unabhängig davon, ob es sich um eine Member-Funktion oder eine nicht-Member- friend -Funktion handelt, ist implizit eine inline-Funktion , es sei denn, sie ist an ein benanntes Modul gebunden (seit C++20) .

Eine Funktion, die in ihrer ersten Deklaration als constexpr oder consteval (seit C++20) deklariert wird, ist implizit eine Inline-Funktion.

Eine gelöschte Funktion ist implizit eine Inline-Funktion: Ihre (gelöschte) Definition kann in mehr als einer Übersetzungseinheit erscheinen.

(seit C++11)

Der inline -Spezifizierer, wenn verwendet in einer Deklarator-Spezifizierer-Sequenz einer Variable mit statischer Speicherdauer (statisches Klassenmitglied oder Namensbereichs-Variable), deklariert die Variable als Inline-Variable .

Ein statisches Datenelement, das in seiner ersten Deklaration als constexpr deklariert wird, ist implizit eine Inline-Variable.

(seit C++17)

Inhaltsverzeichnis

Erklärung

Eine Inline-Funktion oder Inline-Variable (since C++17) hat die folgenden Eigenschaften:

  • Die Definition einer Inline-Funktion oder Variable (since C++17) muss in der Übersetzungseinheit, in der sie verwendet wird, erreichbar sein (nicht notwendigerweise vor dem Zugriffszeitpunkt).
  • Eine Inline-Funktion oder Variable (since C++17) mit externer Verknüpfung (z.B. nicht als static deklariert) hat die folgenden zusätzlichen Eigenschaften:
  • Es kann mehrere Definitionen einer Inline-Funktion oder Variable (seit C++17) im Programm geben, solange jede Definition in einer separaten Übersetzungseinheit erscheint und (für nicht-statische Inline-Funktionen und Variablen (seit C++17) ) alle Definitionen identisch sind. Beispielsweise kann eine Inline-Funktion oder eine Inline-Variable (seit C++17) in einer Header-Datei definiert werden, die in mehrere Quelldateien eingebunden wird.
  • Sie muss in jeder Übersetzungseinheit als inline deklariert werden.
  • Sie hat in jeder Übersetzungseinheit dieselbe Adresse.

In einer Inline-Funktion,

  • Funktionslokale statische Objekte in allen Funktionsdefinitionen werden über alle Übersetzungseinheiten hinweg geteilt (sie beziehen sich alle auf dasselbe Objekt, das in einer Übersetzungseinheit definiert ist).
  • Typen, die in allen Funktionsdefinitionen definiert sind, sind ebenfalls in allen Übersetzungseinheiten gleich.

Inline const-Variablen im Namespace-Bereich haben standardmäßig external linkage (im Gegensatz zu nicht-inline nicht-flüchtigen const-qualifizierten Variablen).

(since C++17)

Die ursprüngliche Absicht des inline Schlüsselworts war, dem Optimierer als Hinweis zu dienen, dass Inline-Ersetzung einer Funktion gegenüber einem Funktionsaufruf bevorzugt wird, das heißt, anstatt den Funktionsaufruf als CPU-Befehl auszuführen, um die Steuerung an den Funktionskörper zu übergeben, wird eine Kopie des Funktionskörpers ausgeführt, ohne den Aufruf zu generieren. Dies vermeidet den durch den Funktionsaufruf entstehenden Overhead (Übergeben der Argumente und Abrufen des Ergebnisses), kann jedoch zu einer größeren ausführbaren Datei führen, da der Code für die Funktion mehrfach wiederholt werden muss.

Da Inline-Substitution in der Standardsemantik nicht beobachtbar ist, sind Compiler frei, Inline-Substitution für jede Funktion zu verwenden, die nicht als inline markiert ist, und ebenso frei, Funktionsaufrufe für jede als inline markierte Funktion zu generieren. Diese Optimierungsentscheidungen ändern nicht die oben aufgeführten Regeln bezüglich mehrfacher Definitionen und gemeinsamer Statics.

Da die Bedeutung des Schlüsselworts inline für Funktionen seit C++98 "mehrere Definitionen sind erlaubt" und nicht "Inlining ist bevorzugt" bedeutet, wurde diese Bedeutung auf Variablen erweitert.

(since C++17)

Hinweise

Wenn eine Inline-Funktion oder Variable (since C++17) mit externer Bindung in verschiedenen Übersetzungseinheiten unterschiedlich definiert wird, ist das Programm fehlerhaft, keine Diagnose erforderlich.

Der inline -Spezifizierer kann nicht mit einer Funktions- oder Variablendeklaration (seit C++17) im Blockbereich (innerhalb einer anderen Funktion) verwendet werden.

Der inline Spezifizierer kann keine Funktion oder Variable (seit C++17) neu deklarieren, die bereits in der Übersetzungseinheit als non-inline definiert wurde.

Die implizit generierten Elementfunktionen und jede Elementfunktion, die als defaulted auf ihrer ersten Deklaration deklariert wird, sind inline genau wie jede andere Funktion, die innerhalb einer Klassendefinition definiert ist.

Wenn eine Inline-Funktion in verschiedenen Übersetzungseinheiten deklariert wird, müssen die kumulierten Mengen der Default-Argumente am Ende jeder Übersetzungseinheit identisch sein.

In C müssen Inline-Funktionen nicht in jeder Übersetzungseinheit als inline deklariert werden (höchstens eine darf nicht- inline oder extern inline sein), die Funktionsdefinitionen müssen nicht identisch sein (aber das Programmverhalten ist nicht spezifiziert, wenn es davon abhängt, welche aufgerufen wird), und die funktionslokalen statischen Variablen sind zwischen verschiedenen Definitionen derselben Funktion unterschiedlich.

Siehe statische Datenelemente für zusätzliche Regeln über inline statische Mitglieder.

Inline-Variablen beseitigen das Hauptproblem bei der Paketierung von C++-Code als Header-only-Bibliotheken.

(seit C++17)
Feature-Test-Makro Wert Std Feature
__cpp_inline_variables 201606L (C++17) Inline-Variablen

Schlüsselwörter

inline

Beispiel

Header "example.h":

#ifndef EXAMPLE_H
#define EXAMPLE_H
#include <atomic>
// Funktionen, die in mehreren Quelldateien enthalten sind, müssen inline sein
inline int sum(int a, int b)
{
    return a + b;
}
// Variablen mit externer Verknüpfung, die in mehreren Quelldateien enthalten sind, müssen inline sein
inline std::atomic<int> counter(0);
#endif

Quelldatei #1:

#include "example.h"
int a()
{
    ++counter;
    return sum(1, 2);
}

Quelldatei #2:

#include "example.h"
int b()
{
    ++counter;
    return sum(3, 4);
}

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
CWG 281 C++98 Eine Friend-Funktionsdeklaration konnte den inline-Spezifizierer verwenden
selbst wenn die befreundete Funktion keine Inline-Funktion ist
Derartige Verwendungen verbieten
CWG 317 C++98 Eine Funktion konnte als inline deklariert werden, selbst wenn sie eine nicht-inline
Definition in derselben Übersetzungseinheit vor der Deklaration hatte
Das Programm ist in diesem Fall
fehlerhaft
CWG 765 C++98 Ein in einer Inline-Funktion definierter Typ könnte
in verschiedenen Übersetzungseinheiten unterschiedlich sein
Solche Typen sind in allen
Übersetzungseinheiten identisch
CWG 1823 C++98 Zeichenkettenliterale in allen Definitionen einer Inline-
Funktion wurden über alle Übersetzungseinheiten hinweg geteilt
Die Anforderung wurde aufgrund von
Konsistenz und Implementierungen entfernt
CWG 2531 C++17 Ein statisches Datenelement könnte implizit inline sein, selbst wenn
es nicht als constexpr in seiner ersten Deklaration deklariert wurde
Es ist in diesem Fall nicht implizit
inline

Siehe auch

C-Dokumentation für inline