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