Optimisation et des drapeaux pour faire une bibliothèque statique avec g++
Je commence tout juste avec le compilateur g++ sous Linux et ai quelques questions sur les drapeaux du compilateur. Ici sont-ils
Optimisations
J'ai lu sur l'optimisation des drapeaux -O1
, -O2
et -O3
dans le g++ page de manuel. J'ai pas compris quand utiliser ces indicateurs. Habituellement ce niveau d'optimisation utilisez-vous? Le g++ manuel dit ce qui suit pour -O2
.
Optimiser encore plus. CCG effectue presque toutes les prises en charge des optimisations qui ne nécessitent pas d'espace-vitesse. Le compilateur n'effectue pas de déroulement de la boucle ou de la fonction inline 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é.
Si ce n'est pas l'in-lining et le déroulement de la boucle, comment le dit il sied de performance sont atteints et que cette option est recommandée?
Bibliothèque Statique
Comment puis-je créer une bibliothèque statique à l'aide de g++? Dans Visual Studio, je peux choisir un projet de bibliothèque de classes et il sera compilé dans "lib" du fichier. Quel est l'équivalent en g++?
- En 2003, de GCC -O3 était buggé et a obtenu une mauvaise réputation. aujourd'Hui, il produit de mauvais code uniquement lorsque vous enfreignez les règles, mais des gens comme les règles de rupture et d'être fou lorsque les conséquences se produisent, afin qu'ils collent à -O2 afin d'éviter les conséquences de l'écriture illégal code.
Vous devez vous connecter pour publier un commentaire.
La règle de base:
Lorsque vous avez besoin de débogage, utilisez -O0 (et -g pour générer des symboles de débogage.)
Lorsque vous vous apprêtez à expédier, utilisez -O2.
Lorsque vous utilisez gentoo, utilisez -O3...!
Lorsque vous avez besoin de le mettre sur un système embarqué, utilisez -Os (optimiser pour la taille, pas d'efficacité.)
Le manuel de gcc liste de toutes les options implicites par chaque niveau d'optimisation. À O2, vous obtenez des choses comme des constantes, direction de la prévision et de la coopération, qui peut changer de façon significative la vitesse de votre application, en fonction de votre code. L'exact options sont dépendant de la version, mais ils sont documentés en détail.
De construire une bibliothèque statique, vous utiliser la réalité augmentée comme suit:
Ranlib n'est pas toujours nécessaire, mais il n'y a pas de raison pour ne pas l'utiliser.
ranlib
, il est "tout à fait équivalent à l'exécution de l'ar-s". Je crois que le ci-dessus peut être simplifié à une seule ligne:ar rcs libfoo.a foo.o foo2.o ...
Au sujet de quand utiliser ce que l'option d'optimisation - il n'y a pas qu'une seule bonne réponse.
Certains niveaux d'optimisation peut, à tout moment, une baisse de la performance. Il dépend du type de code que vous écrivez et l'exécution motif qu'il a, et dépend du PROCESSEUR vous sont en cours d'exécution sur.
(Pour donner un simple exemple canonique - le compilateur peut décider d'utiliser une optimisation de votre code légèrement plus grand qu'avant. Cela peut entraîner une certaine partie du code pour ne rentrent plus dans le cache d'instructions, à quel point d'accès beaucoup plus de mémoire serait nécessaire - dans une boucle, par exemple).
Il est préférable de mesurer et d'optimiser pour ce que vous avez besoin. Essayez, de mesurer et de décider.
Une règle de pouce - le plus grand nombre d'optimisations sont effectuées sur votre code, plus il est difficile de débogage à l'aide d'un débogueur (ou lire ses démontage), parce que le C/C++ vue de la source s'éloigne de la binaire. C'est une bonne règle de base pour travailler avec moins d'optimisations lors du développement /débogage pour cette raison.
Il existe de nombreuses optimisations du compilateur peut exercer, autre que le déroulement de la boucle et inline. Déroulement de la boucle et de l'in-lining sont spécifiquement mentionnés car, même s'ils rendre le code plus rapide, il est également plus grande.
Pour faire une bibliothèque statique, utilisez l'option "g++ -c' pour générer la .o fichiers et 'ar' pour les archiver dans une bibliothèque.
En ce qui concerne la bibliothèque Statique question, la réponse donnée par David Cournapeau est correct, mais vous pouvez également utiliser le 's' drapeau 'ar' plutôt que de courir ranlib sur votre bibliothèque statique fichier. Le 'ar' page de manuel états qui
Quelle que soit la méthode que vous utilisez est juste une question de préférence personnelle.