Pregunta

Decir que tengo una función

void do_something() {
    //....
    #ifdef FEATURE_X
        feature_x();
    #endif
    //....
}

Puedo compilar y ejecutar este sin problemas;si desea que la función que me puede pasar -D FEATURE_X y funciona.

Sin embargo, lo que si me gustaría poner do_something en otro archivo (Y no tener que volver a compilar el archivo así cada vez que me decido a cambiar la opción).Si fue en el mismo archivo, supongo que

const int FEATURE_X=0;

void do_something() {
    //....
    if(FEATURE_X) {
        feature_x();
    }
    //....
}

utilizará la eliminación de código muerto adecuadamente, eliminando la llamada.Si pongo esto en otro archivo, sin LTO,

extern const int FEATURE_X;

void do_something() {
    //....
    if(FEATURE_X) {
        feature_x();
    }
    //....
}

No va a eliminar el código (Que no tiene manera de saber).Así, con enlace optimización del tiempo permitido, puede que el compilador detecte el valor de FEATURE_X en el momento de enlazar, determinar si el código es utilizado o no, y quitarlo si es apropiado?

¿Fue útil?

Solución

GCC cruza módulo inalcanzable función de eliminación, pero no será capaz de determinar el código está muerto en su última prueba, debido a que el valor de la constante de FEATURE_X será determinado demasiado tarde.

Si va a utilizar -D camino o poner su const int FEATURE_X=0; en cada módulo, a continuación, sí, el código será eliminado.

Otros consejos

Si en lugar de la que se hace referencia código:

extern const int FEATURE_X;

void do_something() {
    //....
    if(FEATURE_X) {
        feature_x();
    }
    //....
}

lo que si fue hecho con un vínculo de tiempo variable así:

extern const int FEATURE_X;

void do_something() {
    //....
    if(NULL != &FEATURE_X) {
        feature_x();
    }
    //....
}

A continuación, en el enlace de archivo de instrucciones, definir

define exported symbol FEATURE_X = 0x0

Habrá de todos modos para optimizar en tiempo de vínculo?

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