Les optimisations telles que la propagation constante sont possibles entre les fonctions dans la même unité de compilation (c'est-à-dire. même fichier).
Par exemple: p> Dans cet exemple, je pense qu'un compilateur suffisamment intelligent peut propager la "4" constante à la fonction "F", résolvant l'arithmétique entier avec
L'autre constante '3' et propage la valeur de résultat qui replique donc tout à la valeur finale "8". p> (Eh bien, corrigez-moi si je me trompe ..) P> Cependant, ce qui se passe si la fonction 'F' est dans une autre unité de compilation. Comme ils sont compilés séparément, le compilateur ne peut pas
Optimiser de cette façon. p> signifie-t-il que les optimisations ne sont possibles que dans la même unité de compilation ou y a-t-il des optimisations tardives en retard effectuées de temps de liaison? p> p>
5 Réponses :
GCC 4.5 Optimisation de liaison introduite. Afaik, cela ne fonctionne que sur les cibles X86 et X64. P>
Microsoft Visual Studio prend en charge WPO (optimisation de programme entière) activée par le commutateur LTCG (génération de code de liaison). P>
Cela provoque plusieurs autres problèmes que je ne me souviens plus maintenant et est préféré par de nombreux développeurs. P>
Ici, ils vont: msdn.microsoft.com/en-us/magazine/ccc301698. ASPX 1. Bibliothèques statiques beaucoup plus grandes 2. Bibliothèques statiques avec "bytecode" pouvant devenir non supportées à tout moment.
J'en ai eu plus, avec de très grandes bases de code. En outre, j'ajouterais un temps de compilation.
@Shachartooth: Bytecode est simplement une présentation intermédiaire. De nombreux compilateurs le font de cette façon. Pour une optimisation du temps de liaison, il est conseillé de recompiler tout le programme à chaque fois - à quoi servent également la manière dont les constructions de libération sont censées être faites. Ainsi, les versions incompatibles possibles du bytecode ne sont pas vraiment un problème.
@ Dummy00001: Oui, mais vous serez peut-être tenté d'expédier votre code en tant que bibliothèque statique à quelqu'un. Si vous faites cela avec une bibliothèque compilée avec LTCG, cela peut devenir inutilisable lorsque l'utilisateur met à jour le compilateur.
@ Dummy00001 Ce n'est pas intermédiaire: les bibliothèques statiques, qui ne sont que des packages de fichiers OBJ, sont préférées de frais d'expédition du code compilé sous Windows, où les DLL ne prennent pas en charge la liaison dynamique (problème de globaux partagés)
Oui, pour le compilateur Visual C ++ dans Visual Studio, il est connu sous le nom de Optimisation du programme entier : p>
L'optimisation de l'ensemble du programme permet la compilateur pour effectuer des optimisations avec informations sur tous les modules de la programme. Sans programme complet Optimisation, optimisations sont effectué sur un module (compiland) base p>
avec des informations sur tous les modules, le Compiler peut: p>
optimiser l'utilisation de registres à travers frontières de fonction. P> li>
faire un meilleur travail de suivi modifications des données globales, permettant une réduction du nombre de charges et Magasins. P> LI>
faire un meilleur travail de suivi de la ensemble possible d'éléments modifiés par un Déréférence du pointeur, réduisant la Nombre de charges et de magasins. P> li>
en ligne une fonction dans un module même Lorsque la fonction est définie dans un autre module. P> li> ul> blockQuote>
MSVC (depuis 8,0: VS2005) et GCC (depuis 4.5) Soutenir le concept. P>
MSVC utilise un commutateur Compiler GCC doit l'avoir activé et utilise le Le "problème" est que chaque unité de compilation (fichier source) (et dans le cas de MSVC chaque bibliothèque) doit être compilée avec ceci, vous ne pouvez donc pas utiliser d'anciens fichiers d'objets binaires compilés sans elle. Il fait également déboguer plus fort, car l'optimiseur est beaucoup plus agressive et imprévisible. P> / GL code> et interrupteur de liaison
/ ltcg code>. Documentation P> LI>
-flto code>,
-fwhaole-programme code>,
-fwhopr code> et / ou < Code> -Combine code> au même effet. Documentation (recherche des options de votre navigateur) p> < / li>
ul>
... et les fichiers .lib deviennent de manière immense. Pourtant, c'est incroyable ce qu'il peut faire pour coder l'élimination.
Clang compile à LLVM IR et la liaison LLVM effectue une optimisation du programme entier lorsqu'elle produit un binaire indigène. P>
LLVM permet de mélanger et de correspondre vraiment à des modules et à les optimiser séparément ou combiné. Et offre de nombreuses possibilités d'optimisation (probablement trop nombreuses).
Question latérale: Un script peut-il créer un seul fichier de gros .C de toutes les possibilités d'optimisation d'une arborescence source?
Oui, mettre tout le code dans un seul fichier s'appelle Amalgamation - sqlite.org/amalgamation.html - et est utilisé pour exactement cet objectif.
seulement lorsque le code le supporte. Le préprocesseur définit, les définitions de l'unité statique par traduction, des limites du compilateur et d'autres choses gênent. OTOH, il peut également accélérer de manière significative.