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 parfois ld 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

InformationsquelleAutor Honza | 2014-05-19