Question

Dis que j'ai une fonction

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

Je peux compiler et exécuter ceci sans problème ;si je veux la fonctionnalité, je peux passer -D FEATURE_X et il fonctionne.

Cependant, que se passe-t-il si je souhaite mettre do_something dans un autre fichier (et je n'ai pas besoin de recompiler ce fichier également à chaque fois que je décide de modifier l'option).Si c'était dans le même fichier, je suppose que

const int FEATURE_X=0;

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

utilisera correctement l'élimination du code mort, éliminant ainsi l'appel.Si je mets ça dans un autre fichier, sans LTO,

extern const int FEATURE_X;

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

Il ne supprimera pas le code (il n’a aucun moyen de le savoir).Ainsi, avec l'optimisation du temps de liaison activée, le compilateur peut-il détecter la valeur de FEATURE_X au moment de la liaison, déterminer si le code est utilisé ou non et le supprimer le cas échéant ?

Était-ce utile?

La solution

GCC supprime les fonctions inaccessibles des modules croisés, mais il ne sera pas en mesure de déterminer que le code est mort dans votre dernier scénario de test, car la valeur constante de FEATURE_X sera déterminée trop tard.

Si vous utilisez la méthode -D ou mettez votre const int FEATURE_X=0; dans chaque module alors oui, le code sera éliminé.

Autres conseils

Si au lieu du code référencé :

extern const int FEATURE_X;

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

et si cela était fait avec une variable de temps de lien comme ceci :

extern const int FEATURE_X;

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

Ensuite, dans le fichier d'instructions de l'éditeur de liens, définissez

define exported symbol FEATURE_X = 0x0

Y aurait-il un moyen de l'optimiser au moment de la liaison ?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top