Recherche…


Introduction

Lors de la compilation, le compilateur modifiera souvent le programme pour augmenter les performances. Cela est autorisé par la règle as-if , qui autorise toutes les transformations qui ne modifient pas le comportement observable.

Expansion Inline / Inlining

L'expansion en ligne (également appelée inlining) est une optimisation du compilateur qui remplace un appel à une fonction par le corps de cette fonction. Cela économise l'appel de la fonction, mais au détriment de l'espace, car la fonction peut être dupliquée plusieurs fois.

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

L'inlining est le plus souvent fait pour les petites fonctions, où la surcharge de l'appel de la fonction est significative par rapport à la taille du corps de la fonction.

Optimisation de la base vide

La taille de tout objet ou sous-objet membre doit être au moins égale à 1, même si le type est un type de class vide (c'est-à-dire une class ou une struct sans membres de données non statiques), afin de pouvoir garantir que les adresses d'objets distincts du même type sont toujours distinctes.

Cependant, class sous-objets de class base ne sont pas trop limités et peuvent être complètement optimisés à partir de la disposition de l'objet:

#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'optimisation de base vide est couramment utilisée par les classes de bibliothèque standard compatibles avec les allocateurs ( std::vector , std::function , std::shared_ptr , etc.) pour éviter d'occuper un stockage supplémentaire pour son membre allocateur si l'allocateur est sans état. Ceci est réalisé en stockant l'un des membres de données requis (par exemple, pointeur de begin , de end ou de capacity pour le vector ).

Référence: cppreference



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow