56 votes

Les fonctions inutilisées sont-elles optimisées?

Une question assez simple ... De nos jours, les compilateurs ont tendance à faire beaucoup d'optimisations. Suppriment-ils également les fonctions inutilisées de la sortie finale?

32voto

sharptooth Points 93379

Cela dépend du compilateur. Visual C ++ 9 peut le faire - les fonctions static inutilisées sont supprimées à la phase de compilation (il y a même un avertissement C4505 pour cela), les fonctions inutilisées avec liaison externe peuvent être supprimées à la phase de liaison en fonction des paramètres de l'éditeur de liens .

26voto

rubenvb Points 27271

MSVC (le compilateur Visual Studio/éditeur de liens) peut faire cela que si vous compilez avec /Gy et lien avec l' /OPT:REF.

GCC/binutils pouvez le faire si vous compilez avec -ffunction-sections -fdata-sections et lien avec l' --gc-sections.

Ne pas connaître d'autres compilateurs.

17voto

DigitalRoss Points 80400

En règle générale, la réponse est:

Oui: non utilisés static fonctions.

Non: pour les fonctions disponibles dans le monde.

Le compilateur ne sait pas si une autre unité de compilation référence. Aussi, la plupart des objet les types de modules ne permettent pas de fonctions pour être retiré après la compilation et aussi, ne pas fournir un moyen pour l'éditeur de liens de dire si il existe des références internes. (L'éditeur de liens ne peux dire si il y a des externes, autres.) Certains linkers peuvent le faire, mais beaucoup de choses de travail à cet égard.

Bien sûr, une fonction dans son propre module ne sera pas chargé inutilement par n'importe quel éditeur de liens, sauf s'il fait partie d'une bibliothèque partagée. (Parce qu'il pourrait être référencé dans l'avenir au moment de l'exécution, évidemment.)

6voto

supercat Points 25534

De nombreux compilateurs faire, mais cela dépend de la mise en œuvre. Debug souvent inclure toutes les fonctions, pour leur permettre d'être invoquée ou à l'examen de l'intérieur du débogueur. De nombreux systèmes embarqués compilateurs, pour des raisons que je ne comprend pas tout à fait(*), comprend toutes les fonctions dans un fichier objet si ils comprennent tout, mais omet entièrement des fichiers de l'objet qui ne sont pas utilisés du tout.

Notez que dans les langues qui soutien à la Réflexion (par exemple, Java, C#, vb.net, etc.) il est possible, étant donné le nom d'une fonction, pour créer une référence au moment de l'exécution, même en l'absence de références existent dans le code. Par exemple, une routine pourrait accepter une chaîne à partir de la console, munge il d'une certaine façon, et de générer un appel à une fonction de ce nom. Il n'y aurait aucun moyen pour un compilateur ou l'éditeur de liens de savoir quels noms peuvent être générés, et donc aucun moyen de savoir quelles fonctions peut être oublier de le code. Pas de difficulté existe en C ou C++, cependant, puisqu'il n'est pas défini de code pour créer une référence à une fonction, une variable ou une constante sans une référence explicite existant dans le code. Certaines implémentations peuvent arranger les choses pour que consécutivement déclaré des constantes ou des variables seront stockées de manière consécutive, et l'on pourrait ainsi créer une référence à une, plus tard,-a déclaré l'un par l'ajout d'un décalage à un état antérieur,-a déclaré l'un, mais le comportement de ces astuces est pas explicitement garanti par le C ou C++ normes.

(*)Je comprends que ça rend la compilation et la liaison plus facile, mais les ordinateurs d'aujourd'hui devrait avoir aucune difficulté à courir plus sophistiquée, la compilation et la liaison des algorithmes de celle qui aurait été pratique dans les dernières décennies. Si rien d'autre, deux passe-pré-compilation/pré-link/compiler/méthode de lien sur la pré-compilation/lien phase de produire une liste de choses qui sont les plus utilisées, et sur le "vrai" compilation/lien phase omettre celles qui ne le sont pas.

6voto

rsachetto Points 135

Avec gcc, si vous activez les optimisations, il peut supprimer les fonctions inutilisées et le code mort.

Plus d'informations sur les optimisations gcc peuvent être trouvées ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X