Faire des fonctions inutilisées optimiser l'extérieur?
Assez simple question... Compilateurs ces jours-ci ont tendance à faire une quantité importante d'optimisations. Ont-ils aussi supprimer les fonctions de la sortie finale?
Vous devez vous connecter pour publier un commentaire.
Il dépend du compilateur. Visual C++ 9 peut le faire - inutilisé
static
fonctions sont enlevées à la phase de compilation (il y a même un C4505 avertissement pour ça), des fonctions inutilisées avec une liaison externe peut être supprimé à la phase d'édition de liens selon les 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/OPT:REF
.GCC/binutils pouvez le faire si vous compilez avec
-ffunction-sections -fdata-sections
et lien avec--gc-sections
.Ne sais pas sur les autres compilateurs.
/OPT:REF
conduit à des comportements atypiques: il permettra d'optimiser les fonctions dont seule l'adresse est pris, ainsi que l'adresse n'est plus valable. Cela ne se produit pas pour GCC.En règle générale, la réponse est:
Oui: inutilisé
static
fonctions.Pas: 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 externe ceux.) Certains linkers peuvent le faire, mais beaucoup de choses fonctionnent contre cette.
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.)
dlopen
avecRTLD_LAZY
implique qu'il est possible.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.
Noter 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.
Avec gcc si vous tournez sur la optmizations il peut supprimer les fonctions de code mort.
Plus sur gcc optimisations peuvent être trouvés ici
Beaucoup de temps, oui. Son souvent appelé éditeur de liens de décapage.
Quand il s'agit de MS c'est le de l'éditeur de liens qui prend soin de ce pendant la phase d'édition de liens et le compilateur peut vous avertir de la inutilisés des fonctions statiques de fichier (champ d'application). Si vous souhaitez que l'éditeur de liens à supprimer les fonctions que vous utilisez le /OPT:REF option:
Sous MSVC et avec des fonctions globales ou variable, vous pouvez utiliser __declspec( selectany ).
Il va supprimer la fonction ou la variable si elle n'a pas été référencé dans le code si l'option de l'éditeur de liens /OPT:REF (Optimisations) est sélectionné.
Tout dépend du compilateur et de ses paramètres (code construit en "debug" configurations en général n'est pas optimisé), avec le code en lui-même et la planète de l'alignement.
Le sous-jacent chose, c'est: vous ne devriez pas vous soucier de ce genre de choses. Faites confiance à votre compilateur.