Buscar..


Introducción

Al compilar, el compilador a menudo modificará el programa para aumentar el rendimiento. Esto está permitido por la regla "como si" , que permite cualquier y todas las transformaciones que no cambian el comportamiento observable.

Expansión en línea / en línea

La expansión en línea (también conocida como en línea) es la optimización del compilador que reemplaza una llamada a una función con el cuerpo de esa función. Esto ahorra la sobrecarga de llamadas a la función, pero a costa de espacio, ya que la función puede duplicarse varias veces.

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

La alineación se realiza más comúnmente para funciones pequeñas, donde la sobrecarga de llamadas a funciones es significativa en comparación con el tamaño del cuerpo de la función.

Optimización de la base vacía

Se requiere que el tamaño de cualquier objeto o subobjeto miembro sea al menos 1, incluso si el tipo es un tipo de class vacío (es decir, una class o struct que no tiene miembros de datos no estáticos) para poder garantizar que Las direcciones de objetos distintos del mismo tipo son siempre distintas.

Sin embargo, class subobjetos de la class base no están tan restringidos, y pueden optimizarse completamente desde el diseño del objeto:

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

La optimización de la base vacía se usa comúnmente en las clases de bibliotecas estándar compatibles con el asignador ( std::vector , std::function , std::shared_ptr , etc.) para evitar ocupar cualquier almacenamiento adicional para su miembro asignador si el asignador no tiene estado. Esto se logra almacenando uno de los miembros de datos requeridos (p. Ej., Puntero de begin , end o capacity para el vector ).

Referencia: cppreference



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow