9
votes

Différence de performance entre le programme GCC et G ++ pour C

permet de dire que j'ai écrit un programme en C et la compila avec GCC et G ++, quelle compilation sera plus rapide? GCC ou G ++? Je pense que la compilation G ++ le rendra lent, mais pas sûr de cela.

Permettez-moi de clarifier ma question à nouveau à cause de la confusion à propos de GCC.

Soit I Compiler le programme AC comme celui-ci sur la console. xxx

qui va fonctionner plus vite?


1 commentaires

Vous êtes peut-être intéressé à regarder shooterout.alioth.debian.org/u32q/c.php qui compare de nombreuses langues exécutant des programmes similaires. Il s'avère que certaines choses c sont plus rapides et certaines C ++ sont plus rapides, mais les différences sont assez mineures.


6 Réponses :


2
votes

Je pense qu'ils produiront tous les deux le même code de la machine, et donc la même vitesse sur votre ordinateur.

Si vous voulez savoir, vous pouvez compiler l'assemblage pour les deux et comparer les deux, mais je parie que ils créent le même assemblage, et donc le même code de machine.


5 commentaires

Ce que je pense, c'est que g ++ générera plus d'instruction en montage, peut donc prendre plus de temps que GCC?


@itsaboutCode: pourquoi? Il suffit de l'exécuter deux fois et de comparer la sortie si vous êtes inquiet.


Je suis convaincu qu'il y a une relation inverse entre l'expérience de programmation et le niveau de préoccupation concernant l'optimisation.


@Tyler: +1 Merci pour le rire! Je me demande s'il y a aussi une relation similaire pour la fascination avec x = x ++ + -x et d'autres non-sens UB comme ça.


Mythe: L'optimisation prématurée est la racine de tout mal. Vérité: L'amour de l'optimisation prématurée est la racine de tout mal. :)



1
votes

http: //gcc.gnu .Org / OnlineDocs / GCC-3.3.6 / GCC / G_002B_002B-and-GCC.HTML

GCC est une collection de compilateur. Il est principalement utilisé pour la compilation de C, C ++, ADA, Java et de nombreuses autres langages de programmation. G ++ fait partie de la collection GNU Compiler (GCC).
Je veux dire que GCC comprend G ++. Lorsque nous utilisons GCC pour la compilation de C ++, il utilise g ++. Les fichiers de sortie seront différents car le compilateur G ++ utilise sa propre bibliothèque de temps d'exécution.

Edit: d'accord, pour clarifier les choses, car nous avons un peu de confusion dans la nommée ici. GCC est la collection GNU Compiler. Il peut compiler ADA, C ++, C et un milliard et demi d'autres langues. C'est un «backend» aux différents compilateurs de «front-end» tels que Gnat. Allez lire le lien que j'ai fabriqué en haut de la page de gcc.gnu.org.

GCC peut également faire référence au compilateur GNU C. Cela compilera CODE C ++ si la commande -lstdc ++, mais sera normalement étouffée et mourra, car elle ne tire pas dans les bibliothèques C ++.

g ++, le compilateur GNU C ++, comme le compilateur GNU C est une extrémité avant de la collection GNU Compiler. La différence entre le compilateur C est qu'il inclut automatiquement ces bibliothèques et fait quelques autres petits modifications, car il suppose que cela va être nourri au code C ++ pour compiler.

C'est là que vient la confusion. Cela clarifie-t-il des choses un peu?


6 commentaires

Je les ai vus produire une assemblée différente sur le même code C.


Ce n'est pas tout à fait vrai. Les sections .dynstr, .rodata et .eh_frame sont significativement différentes dans mon programme de test trivial. Le code exécutable lui-même a un trampoline supplémentaire (_gxx_personality_v0 @ plt) et commande de certaines choses légèrement différemment dans la version g ++. Cela n'aura pas d'impact significatif sur le temps de chargement, mais ce n'est pas identique.


Selon la documentation, GNU GCC et GNU G ++ sont un et le même. S'ils produisent du code différent, je vais enquêter et transmettre cette information à la FSF pour avoir la documentation revisitée.


Outre les sections de données, j'ai vu le changement de code réel. Et je ne vois pas où ils prétendent que cela ne se produira pas.


-1: C et C ++ sont des langues différentes. Même si GCC et G ++ seraient le même programme (ce qu'ils ne le sont pas, ils sont deux frontes différentes) ils doivent compiler compiler certaines choses différemment si la sémantique du code (l'interprétation en C ou C ++) sont différents. Si cela fait ou non une différence significative, un indice de référence peut indiquer.


Cette réponse n'a pas répondu à la question.



2
votes

Profilez-le et essayez-le. Je suis certain que cela dépendra du code actuel, même si cela nécessiterait potentiellement un cas vraiment étrange d'obtenir un bytecode différent. Bien que si vous n'avez pas externe c {} autour de votre code C et que vous travaillez bien en C, je ne sais pas comment "la compiler comme si elle était c ++" pourrait fournir une vitesse, Sauf si les optimisations de compilateur particulières dans g ++ viennent d'arriver être un peu mieux pour votre situation particulière ...


0 commentaires

2
votes

Le code de la machine généré doit être identique. La version g ++ d'A.out se liera probablement dans quelques bibliothèques de soutien supplémentaires. Cela rendra l'heure de démarrage de A.out être plus lente de quelques appels système.

Il n'y a pas vraiment de différence pratique cependant. La liaison Linux ne deviendra pas sensiblement plus lente tant que vous atteignez 20 à 40 bibliothèques liées et des milliers de symboles pour résoudre.


0 commentaires

2
votes

Les exécutables GCC et G ++ sont juste en tête, ce ne sont pas les compilateurs réels. Ils gèrent tous les deux les compilateurs C ou C ++ réels (et LD, AR, tout ce qui est nécessaire pour produire la sortie que vous avez demandée) en fonction des extensions de fichiers. Donc, vous obtiendrez exactement le même résultat. G ++ est couramment utilisé pour C ++ car il s'agit d'une liaison avec la bibliothèque C ++ standard (iostreams, etc.).

Si vous souhaitez compiler C code C ++, modifiez l'extension de fichier ou faire quelque chose comme ceci: < Pré> xxx


4 commentaires

Alors, qu'est-ce que vous dites si j'essaie de compiler C code C ++, cela peut prendre plus de temps que la compilation du code C?


Je ne sais pas. Mais puisque le compilateur C ++ doit naturellement être plus complexe, cela semble probable. Prendrait probablement beaucoup de code pour voir une différence, cependant. Vous pouvez l'essayer.


Man GCC: "G ++ est un programme qui appelle GCC et friands des fichiers .C, .h et .i Fichiers en tant que fichiers source C ++ au lieu de fichiers source C, sauf si -x est utilisé" Ceci est donc faux.


Désolé, il semble que g ++ est effectivement par défaut en mode C ++ pour les fichiers .c. Autre que mon explication est correcte selon certains tests rapides, je viens de faire avec Mingw 3.4.5. Encore une fois, cela pourrait être juste parce que Windows utilise une correspondance de nom de fichier insensible à une casse, et puisque. Capital C) est utilisé pour C ++ Code.



28
votes

Premièrement: la question (et certaines des autres réponses) semblent être basées sur la prémisse défectueuse que c est un sous-ensemble strict de C ++, ce qui n'est pas en fait le cas. Compiler c comme c ++ est pas em> la même chose que la compilation que c: il peut modifier la signification de votre programme!

C compilera principalement comme C ++ et donnera principalement les mêmes résultats, mais là-bas sont des choses qui sont définies explicitement em> donner un comportement différent. p>

Voici un exemple simple - s'il s'agit de votre AC code>: p>

$ g++ a.c
$ ./a.out
1


1 commentaires

+1. Pour ceux qui pourraient être intéressés par plus de détails sur ce sujet, il existe des tonnes de différences sur un exemple de caractère brillant. David R. Tribble a fait de bonnes recherches sur cela qui peut être trouvée ici . Wikipedia a un article appelé " Compatibilité de C et C ++ " qui est également utile .