C++
Optimierung
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