Ricerca…


introduzione

Durante la compilazione, il compilatore spesso modificherà il programma per aumentare le prestazioni. Questo è permesso dalla regola as-if , che consente tutte le trasformazioni che non cambiano il comportamento osservabile.

Inline Expansion / Inlining

L'espansione in linea (nota anche come inlining) è l'ottimizzazione del compilatore che sostituisce una chiamata a una funzione con il corpo di quella funzione. Ciò risparmia la funzione di overhead, ma a costo di spazio, poiché la funzione può essere duplicata più volte.

// 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 è più comunemente fatto per piccole funzioni, dove la funzione chiamata overhead è significativa rispetto alla dimensione del corpo della funzione.

Ottimizzazione della base vuota

La dimensione di qualsiasi oggetto o membro subobject è richiesta per essere almeno 1 anche se il tipo è un tipo di class vuoto (cioè una class o una struct che non ha membri di dati non statici), in modo da essere in grado di garantire che gli indirizzi di oggetti distinti dello stesso tipo sono sempre distinti.

Tuttavia, class sottooggetti di class base non sono così limitati e possono essere completamente ottimizzati dal layout dell'oggetto:

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

L'ottimizzazione di base vuota viene comunemente utilizzata dalle classi di libreria standard compatibili con allocatore ( std::vector , std::function , std::shared_ptr , ecc.) Per evitare di occupare spazio di archiviazione aggiuntivo per il relativo membro allocatore se l'allocatore è stateless. Ciò si ottiene memorizzando uno dei membri di dati richiesti (ad esempio, begin , end o puntatore di capacity per il vector ).

Riferimento: cppreference



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow