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