Szukaj…


Wprowadzenie

Podczas kompilacji kompilator często modyfikuje program w celu zwiększenia wydajności. Jest to dozwolone przez zasadę „jak gdyby” , która zezwala na wszelkie transformacje, które nie zmieniają obserwowalnego zachowania.

Inline Expansion / Inlining

Rozbudowa wbudowana (znana również jako inlining) to optymalizacja kompilatora, która zastępuje wywołanie funkcji treścią tej funkcji. Oszczędza to narzutu wywołania funkcji, ale kosztem miejsca, ponieważ funkcja może być duplikowana kilka razy.

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

Inliniacja jest najczęściej wykonywana w przypadku małych funkcji, w których narzut wywołania funkcji jest znaczący w porównaniu z rozmiarem treści funkcji.

Optymalizacja pustej bazy

Rozmiar dowolnego podobiektu obiektu lub elementu musi wynosić co najmniej 1, nawet jeśli typ jest pustym typem class (tj. class lub struct która nie ma elementów niestatycznych), aby móc to zagwarantować adresy różnych obiektów tego samego typu są zawsze różne.

Jednak podobiekty class podstawowej nie są tak ograniczone i można je całkowicie zoptymalizować na podstawie układu obiektu:

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

Optymalizacja pustej bazy jest powszechnie stosowana przez standardowe klasy bibliotek, które są świadome alokatora ( std::vector , std::function , std::shared_ptr itp.), Aby uniknąć zajmowania dodatkowego miejsca dla jego elementu alokatora, jeśli alokator jest bezstanowy. Osiąga się to poprzez zapisanie jednego z wymaganych elementów danych (np. Wskaźnika begin , end lub capacity dla vector ).

Odniesienie: cppreference



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow