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?
Réponses
Trop de publicités? 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 .
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.
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.)
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.