Pregunta

Cuando se incluye una función que toma un puntero en el argumento, ¿el compilador elimina la indirección durante el proceso de optimización? Por supuesto, cuando tiene sentido ...

Aquí hay un ejemplo obvio:

inline void say_hello (person* p) {
    std::cout << "hello " << p->name << std::endl;
}

int main () {
    person goldorak;
    goldorak.name = "Goldorak";

    say_hello(&goldorak);
    return 0;
}

Este caso es trivial, pero si el compilador la optimización hay algunos casos en los que no es así.

Prima: ¿Dónde puedo obtener una lista de algunas optimizaciones "básicas" hechas por mi compilador?

PD: Solo tengo curiosidad

¿Fue útil?

Solución

Supongo que GCC, por lo que el enlace que está buscando es http://gcc.gnu.org/onlinedocs/gcc/optimize-options.html

Y para citar: (esto puede no ser a lo que estabas recibiendo)

-La inyección de findirect en línea también llamadas indirectas que se descubren que se conocen en el momento de la compilación gracias a la inscripción anterior. Esta opción tiene cualquier efecto solo cuando se enciende a sí mismo en las opciones de funciones -finline o -finline-Small-Functions.

Enabled at level -O2.

La documentación equivalente para los compiladores de Visual Studio (incluido C ++)http://msdn.microsoft.com/en-us/library/k1ack8f1.aspx(Puede seguir los enlaces para obtener más información)

Otros consejos

Un buen compilador haría esto. Sin embargo, sería un proceso de dos etapas. Primero en línea en línea la función. Una fase posterior podría darse cuenta de que el único uso de la estructura es mantener temporalmente name y eliminarlo.

Sí, en mi experiencia, esto es cierto tanto para los punteros (C y C ++) como para las referencias (solo C ++, por supuesto); casi cualquier compilador decente optimizará la indirección redundante. Incluso Visual Studio hace esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top