Est-il une raison pourquoi ne pas utiliser des liens à l'optimisation du temps (LTO)?
GCC, MSVC, LLVM, et probablement d'autres toolchains charge le lien-temps (tout le programme) d'optimisation afin de permettre une optimisation des appels entre les unités de compilation.
Est-il une raison de ne pas activer cette option lors de la compilation d'un logiciel de production?
- Voir Pourquoi ne pas utiliser toujours optimisation du compilateur?. Les réponses sont également applicables ici.
- Autant que je sache, lto pour gcc rend votre exécutable plus grand et incompatible avec ld, ld est capable de gérer de votre objet compilé à cause d'un plugin pour le ld de la gcc projet n'existe en effet, mais ce genre d'optimisations ne sont pas "standard", selon le point de vue de l'éditeur de liens. cette idée générale sur un objet compilé qui n'est pas emballé que les autres, ceux qui sont "standard" peut éventuellement conduire à toutes sortes de problèmes .
- Il demande "lors de la compilation d'un logiciel de production" donc, la plupart des réponses ne s'applique pas.
- Pensez-vous avoir de la documentation pour incompatibilité avec ld? Ce que j'ai lu dans le courant de la gcc docs (gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html) et dans un peu ancien wiki (gcc.gnu.org/wiki/LinkTimeOptimization), soit ne dit rien sur ld incompatibilités (gcc docs) ou explicitement les états de compatibilité (wiki). À en juger par le mode de lto opération, à savoir avoir des informations supplémentaires dans les fichiers de l'objet, je dirais que l'objet des fichiers de maintenir la compatibilité.
- La même réponse que pour sauter d'autres efforts d'optimisation -- c'est pas la peine.
- La question était sûrement pas liée à debug, mais à celui qui doit être à la fois rapide, stable et transmis aux clients. Le temps de compilation ne devrait pas être un problème ici.
- vous continuez à regarder dans le ccag docs, vous devez prendre un coup d'oeil dans la gnu binutils documentation ( ld est une partie de binutils, pas gcc ), de toute façon l'existence d'un seul plugin pour l'éditeur de liens confirme que c'est un non-approche standard; je ne sais pas si elles ont l'intention de les intégrer dans le tronc principal ou faire les deux gcc et binutils LTO capables par défaut, mais certainement il n'est pas quelque chose qui est seulement d'environ gcc . suivez la documentation et le développement sur ld si vous voulez en savoir plus.
- Comme vous le savez sûrement gcc est en fait un pilote pour les différentes étapes nécessaires pour produire une sortie souhaitée (par exemple, une séquence de fichiers, un fichier objet, un exécutable, une bibliothèque). Le wiki états ", Malgré le "lien de temps" nom de, LTO n'a pas besoin d'utiliser un éditeur de liens spéciaux caractéristiques. Le mécanisme de base est la détection de GIMPLE sections à l'intérieur des fichiers de l'objet. C'est actuellement mis en œuvre dans collect2. Par conséquent, LTO fonctionne sur n'importe quel éditeur de liens déjà pris en charge par GCC." C'est juste que cette page est à partir de 2009, donc je suis toujours intéressé par les spécifique de la documentation récente.
- Permettant
-O2
fait une différence de ca. +5 secondes à 10 minutes de construire ici. Permettant LTO fait une différence de ca +3 minutes, et parfoisld
est à court d'espace d'adressage. C'est une bonne raison pour toujours compiler avec-O2 (de sorte que les exécutables que vous débogage sont binaires identiques avec celles que vous allez expédier!) et de ne pas utiliser LTO jusqu'à ce qu'il est assez mature (ce qui inclut vitesse acceptable). Votre kilométrage peut varier. - Si votre code est utilisé par des millions d'utilisateurs, votre 3 minutes économie ne justifient pas leur quotidien milliseconde attendre.
- Merci pour la mention spécifique, les besoins de ressources LTO. Pour les grands projets, il y a sûrement devrait être consacré la construction des stations assez puissant pour faire tout le travail.
- Oui certainement, surtout si vous ne faites LTO pour la version release. Mais mon point est que des trucs comme
-O2
est vraiment pas cher (et fonctionne très bien avec le débogueur) que vous pouvez déboguer le même, identique binaire que vous allez expédier sans même le savoir une différence, puisque vous n'utilisez jamais quelque chose de différent. LTO, au cours du développement est un notable coût supplémentaire (temps = coût). Otoh, que, d'une LTOed "libération" binaire, serait différent de celui que vous avez été de débogage (éventuellement présentant quelques-UB que vous avez dans votre code, ou certains compilateur ou l'éditeur de liens bug). - La version release n'est pas le build que j'ai été le débogage, mais la génération qui a survécu à l'essai. Test est une construction séparé de toute façon, installé sur une machine de nettoyage (si je sais que le package d'installation n'est pas manque des dépendances).
- Je crois que l'activation du lien-le temps d'optimisation de la cause de cette erreur: stackoverflow.com/a/46088409/563329
Vous devez vous connecter pour publier un commentaire.
Je suppose que par "logiciel de production" vous dire un logiciel que vous livrez aux clients /mise en production. Les réponses à Pourquoi ne pas utiliser toujours optimisation du compilateur? (aimablement fait remarquer par Mankarse) s'applique principalement à des situations dans lesquelles vous souhaitez déboguer votre code (si le logiciel est encore en phase de développement -- non en production).
La seule bonne, raison valable, je pense que le lien à l'optimisation du temps peut introduire des bogues subtils, voir Lien d'optimisation pour le noyau. En supposant que vous avez des essais appropriés pour vérifier l'exactitude de votre logiciel que vous êtes sur le bateau, je ne vois aucune raison de ne pas utiliser LTO par défaut. (LTO est de plus en plus mature avec le temps, donc espérons que ces bogues subtils seront de moins en moins fréquentes.)
-flto
et c'est tout. 🙂Cette dernière question soulève un autre possible (mais plutôt spécifique) dans laquelle LTO peut avoir des effets indésirables: si le code en question est instrumenté pour le timing, et de séparer les unités de compilation ont été utilisés pour tenter de préserver l'ordre relatif de l'instrumentation et de l'instrumentation des déclarations, alors LTO a une bonne chance de détruire le nécessaire de la commande.
J'ai dit que c'était spécifique.
Si vous avez bien écrit le code, il ne doit être avantageux. Vous pouvez frapper un compilateur/linker bug, mais cela vaut pour tous les types de l'optimisation, c'est rare.
Plus gros inconvénient est qu'il augmente drastiquement le temps de lien.
A part cette,
Considérons un exemple typique de système embarqué,
Prédéfinis abordé les fonctions peuvent être appelées par le biais relatif adresses comme ci-dessous,
BEAUCOUP de choses peuvent provoquer un comportement inattendu.