Sök…


Introduktion

Vid sammanställning kommer kompilatorn ofta att modifiera programmet för att öka prestandan. Detta är tillåtet av as-if-regeln , som tillåter alla transformationer som inte ändrar observerbart beteende.

Inline Expansion / Inlining

Inline expansion (även känd som inlining) är kompilatoroptimering som ersätter ett samtal till en funktion med kroppen för den funktionen. Detta sparar funktionssamtalet över huvudet, men på kostnaden för utrymme, eftersom funktionen kan dupliceras flera gånger.

// 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()
}

Inlining görs vanligtvis för små funktioner, där funktionsanropet är betydande jämfört med storleken på funktionskroppen.

Tom basoptimering

Storleken av något föremål eller medlem subobject krävs för att vara åtminstone en även om typen är en tom class typ (dvs en class eller struct som inte har några icke-statiska data medlemmar) att, för att kunna garantera att adresserna för distinkta objekt av samma typ är alltid distinkta.

Emellertid bas class är subobjects inte så begränsade, och kan vara helt optimerad ut från föremålet layout:

#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));
}

Tom basoptimering används vanligtvis av allokeringsmedvetna standardbiblioteksklasser ( std::vector , std::function , std::shared_ptr , etc) för att undvika att lagra ytterligare lagringsutrymme för dess tilldelningsmedlem om tilldelaren är statslös. Detta uppnås genom att lagra en av de erforderliga datamedlama (t.ex. begin , end eller capacity för vector ).

Referens: cppreference



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow