Suche…


Einführung

Beim Compilieren ändert der Compiler das Programm häufig, um die Leistung zu erhöhen. Dies wird durch die Ist-Regel erlaubt, die alle Transformationen erlaubt, die das beobachtbare Verhalten nicht ändern.

Inline-Erweiterung / Inlining

Inline-Erweiterung (auch Inlining genannt) ist die Compiler-Optimierung, die einen Aufruf einer Funktion durch den Rumpf dieser Funktion ersetzt. Dies spart den Funktionsaufruf-Overhead, jedoch auf Kosten des Platzbedarfs, da die Funktion möglicherweise mehrmals dupliziert wird.

// source:

int process(int value)
{
    return 2 * value;
}

int foo(int a)
{
    return process(a);
}

// program, after inlining:

int foo(int a)
{
    return 2 * a; // the body of process() is copied into foo()
}

Das Inlining wird am häufigsten für kleine Funktionen ausgeführt, bei denen der Funktionsaufruf für die Funktionsaufrufe im Vergleich zur Größe des Funktionskörpers erheblich ist.

Leere Basisoptimierung

Die Größe eines Objekt- oder Member-Subobjekts muss mindestens 1 sein, selbst wenn der Typ ein leerer class (d. struct Eine class oder struct , die keine nicht statischen Datenelemente enthält), um dies gewährleisten zu können Die Adressen verschiedener Objekte desselben Typs sind immer unterschiedlich.

Basisklassen class Unterobjekte sind jedoch nicht so eingeschränkt und können vollständig aus dem Objektlayout heraus optimiert werden:

#include <cassert>

struct Base {}; // empty class

struct Derived1 : Base {
    int i;
};

int main() {
    // the size of any object of empty class type is at least 1
    assert(sizeof(Base) == 1);

    // empty base optimization applies
    assert(sizeof(Derived1) == sizeof(int));
}

Eine leere Basisoptimierung wird im Allgemeinen von zuweisungspflichtigen Standardbibliotheksklassen ( std::vector , std::function , std::shared_ptr usw.) verwendet, um zu vermeiden, dass zusätzlicher Speicher für das Zuordnungsmitglied belegt wird, wenn der Zuweiser zustandslos ist. Dies wird erreicht, indem eines der erforderlichen Datenelemente (z. B. begin , end oder capacity für den vector ) gespeichert wird.

Referenz: cppreference



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow