Pourquoi GCC conserve-t-il des fonctions vides?

Dans la plupart des cas, si je veux créer une fonctionnalité optionnelle en C, je crée simplement deux fonctions, comme ceci:

#ifdef OPTIONAL_SOMETHING void do_something(int n, const char *s) { while (n--) { printf("%s", s); } /* ...You might get the point, really do something... */ } #else void do_something(int n, const char *s) { /* Empty body */ } #endif 

Donc, si le symbole n’est pas défini – lorsque la fonctionnalité est désactivée – une fonction vide est compilée dans l’exécutable.

Dans la liste des assemblages, il semble que GCC comstack et appelle les fonctions vides lorsque les optimisations sont désactivées . Si les optimisations sont activées , également avec -O2 et -O3 , il ne comstack que le code de traitement de stack nécessaire, mais il optimise les instructions d’appel. Dans l’ensemble, il conserve la fonction.

La même chose s’applique aux méthodes non vides, mais non utilisées.

Il faut simplement tout jeter, mais ce n’est pas le cas. Pourquoi est-ce le comportement par défaut? Et juste par curiosité: comment puis-je éliminer cela?

Étant donné que la fonction a une liaison externe (n’est pas static ), le compilateur ne peut pas l’éliminer car un autre fichier object pourrait la référencer. Si la fonction est static , elle sera complètement éliminée.

Si vous voulez que le compilateur intègre éventuellement la fonction, vous devez le lui dire. Déclarez votre fonction en inline , cela permet au compilateur de ne pas émettre la fonction s’il le juge utile.

Cela peut maintenant conduire à une erreur “symbole indéfini” lorsque vous comstackz avec -O0 ou plus. Mettez une “instanciation” comme

 void do_something(int n, const char *s); 

dans une seule unité de compilation (fichier .c).