2010-07-21 18 views
7

Diciamo che ho scritto un programma in C e lo ho compilato con gcc e g ++, quale compilazione funzionerà più velocemente? gcc o g ++? Penso che la compilazione di g ++ lo renderà lento, ma non ne sono sicuro.Differenza di prestazione tra gcc e g ++ per il programma C

Vorrei chiarire nuovamente la mia domanda a causa della confutazione su gcc.

Diciamo che ho compilato il programma a.c come questo su console.

gcc a.c 

g++ a.c 

quale a.out verrà eseguito più veloce?

+0

Potresti essere interessato a http://shootout.alioth.debian.org/u32q/c.php Confronto tra molte lingue che eseguono programmi simili. Risulta che ci sono alcune cose in cui C è più veloce e qualche C++ è più veloce, ma le differenze sono piuttosto ridotte. – jsl4tv

risposta

-1

http://gcc.gnu.org/onlinedocs/gcc-3.3.6/gcc/G_002b_002b-and-GCC.html

GCC è una collezione di compilatori. Viene principalmente utilizzato per la compilazione di C, C++, Ada, Java e molti altri linguaggi di programmazione. G ++ fa parte della raccolta del compilatore gnu (gcc).
Voglio dire gcc include anche g ++. Quando usiamo gcc per la compilazione di C++ usa g ++. I file di output saranno diversi perché il compilatore G ++ utilizza la propria libreria run time.

Modifica: Ok, per chiarire le cose, perché abbiamo un po 'di confusione nel nominare qui. GCC è la raccolta del compilatore GNU. Può compilare Ada, C++, C e un miliardo e mezzo di altre lingue. È un "backend" per i vari compilatori "front-end" di lingue come GNAT. Vai a leggere il link che ho fatto nella parte superiore della pagina da GCC.GNU.Org.

GCC può anche fare riferimento al compilatore GNU C. Questo compilerà il codice C++ se viene dato il comando -lstdC++, ma normalmente soffocheremo e morirà perché non sta estraendo le librerie C++.

G ++, il compilatore GNU C++, come il compilatore GNU C è un front-end della raccolta del compilatore GNU. La differenza tra il compilatore C è che include automaticamente quelle librerie e apporta alcune piccole modifiche, perché si presume che verrà compilato con codice C++.

Da qui deriva la confusione. Questo chiarisce un po 'le cose?

+2

Li ho visti produrre assemblaggi diversi sullo stesso codice C. –

+4

Non è del tutto vero. Sezioni .dynstr, .rodata e .eh_frame sono significativamente diverse nel mio banale programma di test. Il codice eseguibile stesso ha un trampolino extra (_gxx_personality_v0 @ plt) e ordina alcune cose in modo leggermente diverso nella versione g ++. Non avrà un impatto significativo sul tempo di caricamento, ma non è identico. – nmichaels

+0

Secondo la documentazione, GNU GCC e GNU G ++ sono la stessa cosa. Se stanno producendo codice diverso, quindi indagherò e inoltrerò tali informazioni alla FSF per avere la documentazione rivisitata. – Caladain

2

Penso che entrambi produrranno lo stesso codice macchina e quindi la stessa velocità sul computer.

Se si desidera scoprire, è possibile compilare l'assembly per entrambi e confrontare i due, ma sto scommettendo che essi creano lo stesso assembly e quindi lo stesso codice macchina.

+0

Quello che sto pensando è che g ++ genererà più istruzioni in assembly, quindi potrebbe richiedere più tempo per gcc? – itsaboutcode

+3

@itsaboutcode: * Perché? * Basta eseguirlo due volte e confrontare l'output se sei così preoccupato. – GManNickG

+7

Sono convinto che esista una relazione inversa tra esperienza di programmazione e livello di preoccupazione sull'ottimizzazione. –

2

Provalo e provalo. Sono sicuro che dipenderà dal codice reale, anche se richiederebbe potenzialmente un caso davvero strano per ottenere un bytecode diverso. Anche se se non hai extern C {} intorno al tuo codice C, o funziona bene in C, non sono sicuro di come "compilarlo come se fosse C++" potrebbe fornire qualsiasi velocità, a meno che le ottimizzazioni del compilatore particolare in g ++ avvengano semplicemente per essere un po 'meglio per la tua situazione particolare ...

2

Il codice macchina generato dovrebbe essere identico. La versione g ++ di a.out sarà probabilmente collegata a un paio di librerie di supporto aggiuntive. Ciò renderà più lento il tempo di avvio di a.out da alcune chiamate di sistema.

Tuttavia non c'è davvero alcuna differenza pratica. Il linker Linux non diventerà notevolmente più lento fino a raggiungere 20-40 librerie collegate e migliaia di simboli da risolvere.

2

Gli eseguibili gcc e g ++ sono solo front-end, non sono i veri compilatori. Entrambi eseguono i compilatori C o C++ (e ld, ar, qualsiasi cosa sia necessaria per produrre l'output richiesto) in base alle estensioni dei file. Quindi otterrai lo stesso identico risultato. G ++ è comunemente usato per C++ perché si collega alla libreria standard di C++ (iostreams ecc.).

Se vuoi compilare il codice C come C++, o cambiare l'estensione del file, o fare qualcosa di simile:

 
gcc test.c -otest -x c++ 
+0

Quindi cosa stai dicendo se provo a compilare il codice c come C++, potrebbe richiedere più tempo della compilazione del codice c? – itsaboutcode

+0

Non lo so. Ma poiché il compilatore C++ deve essere naturalmente più complesso, sembra probabile. Probabilmente prenderebbe molto codice per vedere effettivamente una differenza, comunque. Potresti provarlo. – torhu

+1

man gcc: * "g ++ è un programma che chiama GCC e tratta file .c, .h e .i come file sorgente C++ invece di file sorgente C a meno che non venga usato -x" *, quindi questo è sbagliato. –

24

In primo luogo: la questione (e alcune delle altre risposte) sembrano essere basata su la premessa errata secondo cui C è un sottoinsieme rigoroso di C++, che in realtà non è il caso. Compilare C come C++ è non come compilarlo come C: può cambiare il significato del tuo programma!

C verrà principalmente compilato come C++, e per lo più darà gli stessi risultati, ma ci sono alcune cose che sono definite esplicitamente per dare un comportamento diverso.

Ecco un semplice esempio - se questa è la a.c:

#include <stdio.h> 

int main(void) 
{ 
    printf("%d\n", sizeof('x')); 
    return 0; 
} 

poi la compilazione di C darà un risultato:

$ gcc a.c 
$ ./a.out 
4 

e la compilazione di C++ darà un risultato diverso (a meno che non Stai usando una piattaforma insolita dove int e char hanno le stesse dimensioni):

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

poiché la specifica C definisce un carattere letterale per il tipo int e la specifica C++ definisce il tipo char.

In secondo luogo: gcc e g++ non sono "lo stesso compilatore". Viene utilizzato lo stesso codice di back-end, ma i front end C e C++ sono pezzi di codice diversi (gcc/c-*.c e gcc/cp/*.c nella sorgente gcc).

Anche se ci si attiene alle parti del linguaggio definite per fare la stessa cosa, non è garantito che il front-end C++ analizzerà il codice esattamente nello stesso modo del front-end C (es. lo stesso input per il back-end), e quindi non garantisce che il codice generato sarà identico. Quindi è certamente possibile che si potrebbe generare codice più veloce dell'altro in alcuni casi - anche se immagino che avresti bisogno di codice complesso per avere qualche possibilità di trovare una differenza, come la maggior parte dell'ottimizzazione e della generazione del codice la magia avviene nel back-end comune del compilatore; e la differenza potrebbe essere in entrambi i modi.

+0

+1. Per coloro che potrebbero essere interessati a maggiori dettagli su questo argomento, ci sono un sacco di differenze in cima a un brillante esempio di carattere. David R. Tribble ha fatto una buona ricerca su questo che può essere trovato [qui] (http://david.tribble.com/text/cdiffs.htm). Wikipedia ha un articolo chiamato "[Compatibilità di C e C++] (http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B)" che è anche utile. –

Problemi correlati