Je commence tout juste avec le compilateur g ++ sous Linux et quelques questions sur les drapeaux du compilateur. Les voici
Optimisations
J'ai lu sur les drapeaux d'optimisation -O1
, -O2
et -O3
dans la page de manuel de g ++. Je n'ai pas compris quand utiliser ces drapeaux. Habituellement, quel niveau d'optimisation utilisez-vous? Le manuel g ++ dit ce qui suit pour -O2
.
Optimiser encore plus. GCC exécute presque toutes les optimisations prises en charge, sans aucun compromis sur la vitesse de l’espace. Le compilateur n'effectue pas de déroulage de boucle ni d'inclusion de fonctions lorsque vous spécifiez -O2. Par rapport à -O, cette option augmente à la fois le temps de compilation et les performances du code généré.
S'il n'effectue pas le déroulement en ligne et le déroulement de la boucle, comment les performances requises sont-elles atteintes et cette option est-elle recommandée?
Bibliothèque statique
Comment créer une bibliothèque statique en utilisant g ++? Dans Visual Studio, je peux choisir un projet de bibliothèque de classes et il sera compilé dans un fichier "lib". Quel est l'équivalent en g ++?
La règle de base:
Lorsque vous avez besoin de déboguer, utilisez -O0 (et -g pour générer des symboles de débogage.)
Lorsque vous vous apprêtez à l'expédier, utilisez -O2.
Lorsque vous utilisez gentoo, utilisez -O3 ...!
Lorsque vous avez besoin de l'installer sur un système intégré, utilisez -Os (optimisez la taille, pas l'efficacité).
Le manuel gcc répertorie toutes les options impliquées pour chaque niveau d’optimisation. Chez O2, vous obtenez des choses telles que le pliage constant, la prédiction de branche et autres, ce qui peut considérablement changer la vitesse de votre application, en fonction de votre code. Les options exactes dépendent de la version, mais elles sont documentées de manière très détaillée.
Pour construire une bibliothèque statique, vous utilisez ar comme suit:
ar rc libfoo.a foo.o foo2.o ....
ranlib libfoo.a
Ranlib n'est pas toujours nécessaire, mais il n'y a aucune raison de ne pas l'utiliser.
En ce qui concerne le moment d'utiliser quelle option d'optimisation - il n'y a pas de réponse correcte unique.
Certains niveaux d’optimisation peuvent parfois nuire aux performances. Cela dépend du type de code que vous écrivez et de son modèle d'exécution, ainsi que de votre CPU.
(Pour donner un exemple canonique simple - le compilateur peut décider d’utiliser une optimisation qui rend votre code légèrement plus volumineux qu’avant. Cela pourrait empêcher une certaine partie du code de s’inscrire dans le cache d’instructions, auquel cas de nombreux autres accès à mémoire serait nécessaire - dans une boucle, par exemple).
Il est préférable de mesurer et d’optimiser tout ce dont vous avez besoin. Essayez, mesurez et décidez.
Une règle empirique importante: plus le code est optimisé, plus il est difficile de le déboguer à l'aide d'un débogueur (ou de lire son désassemblage), car la vue source C/C++ s'éloigne du fichier binaire généré. C'est une bonne règle empirique de travailler avec moins d'optimisations lors du développement/débogage pour cette raison.
Un compilateur peut effectuer de nombreuses optimisations, autres que le déroulage et l'inline de boucle. Le déroulement et l'inline de boucle sont spécifiquement mentionnés ici car, bien qu'ils rendent le code plus rapide, ils le rendent également plus volumineux.
Pour créer une bibliothèque statique, utilisez 'g ++ -c' pour générer les fichiers .o et 'ar' pour les archiver dans une bibliothèque.
En ce qui concerne la question sur la bibliothèque statique, la réponse donnée par David Cournapeau est correcte, mais vous pouvez également utiliser l'indicateur "s" avec "ar" plutôt que d'exécuter ranlib sur votre fichier de bibliothèque statique. La page de manuel 'ar' indique que
Exécuter ar sur une archive équivaut à exécuter ranlib dessus.
Quelle que soit la méthode que vous utilisez, cela dépend simplement de vos préférences personnelles.