2010-07-21 15 views
7

Powiedzmy, że napisałem program w C i skompilowałem go zarówno z gcc jak i g ++, która kompilacja będzie działała szybciej? gcc lub g ++? Myślę, że kompilacja g ++ spowolni, ale nie będzie pewna.Różnica w wydajności między gcc i g ++ dla programu C

Pozwól mi wyjaśnić jeszcze raz moje pytanie powodu confutation o gcc.

powiedzmy skompilować programu A.c tak na konsoli.

gcc a.c 

g++ a.c 

Który a.out będzie działał szybciej?

+0

Być może zainteresuje Cię http://shootout.alioth.debian.org/u32q/c.php Który porównuje wiele języków prowadzących podobne programy. Okazuje się, że jest kilka rzeczy, z których C jest szybsze, a niektóre z C++ są szybsze, ale różnice są niewielkie. – jsl4tv

Odpowiedz

-1

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

GCC jest zbiorem kompilator. Jest używany głównie do kompilacji C, C++, Ada, Java i wielu innych języków programowania. G ++ jest częścią kolekcji kompilatora gnu (gcc).
Mam na myśli gcc zawiera również g ++. Kiedy używamy gcc do kompilacji C++, używa on g ++. Pliki wyjściowe będą różne, ponieważ kompilator G ++ używa własnej biblioteki czasu wykonywania.

Edytuj: Ok, dla wyjaśnienia rzeczy, ponieważ mamy trochę zamieszania w nazewnictwie tutaj. GCC jest kolekcją kompilatorów GNU. Może skompilować Ada, C++, C i półtora miliarda innych języków. Jest to "backend" dla kompilatorów "z przodu" różnych języków, takich jak GNAT. Idź przeczytaj link zrobiony na górze strony z GCC.GNU.Org.

GCC może również odnosić się do kompilatora GNU C. Skompiluje to kod C++, jeśli otrzyma polecenie -lstdC++, ale zwykle dusi się i ginie, ponieważ nie pobiera bibliotek C++.

G ++ GNU kompilator C++, jak GNU C Compiler jest front-end do GNU Compiler Collection. Różnica między kompilatorem C polega na tym, że automatycznie włącza te biblioteki i wykonuje kilka innych drobnych poprawek, ponieważ zakłada, że ​​do kompilacji będzie dostarczony kod C++.

Stąd bierze się zamieszanie. Czy to trochę wyjaśnia?

+2

Widziałem, jak produkują różne zespoły na tym samym kodzie C. –

+4

To nie do końca prawda. Sekcje .dynstr, .rodata i .eh_frame różnią się znacząco w moim trywialnym programie testowym. Sam kod wykonywalny ma dodatkową trampolinę (_gxx_personality_v0 @ plt) i zamawia niektóre rzeczy nieco inaczej w wersji g ++. Nie będzie to miało znaczącego wpływu na czas ładowania, ale nie jest identyczne. – nmichaels

+0

Zgodnie z dokumentacją GNU GCC i GNU G ++ są jednym i tym samym. Jeśli produkują inny kod, to zbadam i prześlę te informacje do FSF, aby uzyskać dokumentację ponownie. – Caladain

2

myślę, że one będą zarówno produkować tego samego kodu maszynowego, a zatem samą prędkość na komputerze.

Jeśli chcesz dowiedzieć się, można skompilować zespół dla obu i porównać dwa, ale założę się, że tworzą one ten sam zespół, a więc ten sam kod maszynowy.

+0

Co myślę, że g ++ wygeneruje więcej instrukcji w montażu, więc może zająć więcej czasu niż gcc? – itsaboutcode

+3

@itsaboutcode: * Why? * Po prostu uruchom go dwukrotnie i porównaj dane wyjściowe, jeśli się martwisz. – GManNickG

+7

Jestem przekonany, że istnieje odwrotna zależność między doświadczeniem w programowaniu a poziomem obaw o optymalizację. –

2

Wyprofiluj i wypróbuj. Jestem pewien, że będzie to zależało od rzeczywistego kodu, nawet jeśli będzie to wymagało naprawdę dziwnego przypadku, aby uzyskać inny kod bajtowy. Chociaż jeśli nie masz extern C {} wokół swojego kodu C i lub działa dobrze w C, nie jestem pewien, jak "kompilowanie go tak, jakby był C++" może zapewnić dowolną prędkość, chyba że optymalizacje konkretnego kompilatora w g ++ właśnie się zdarzają być nieco lepsze dla danej sytuacji ...

2

kodu maszynowego generowane powinny być identyczne. Wersja a.out w wersji g + prawdopodobnie połączy kilka dodatkowych bibliotek wsparcia. To spowoduje, że czas uruchamiania a.out będzie wolniejszy przez kilka wywołań systemowych.

Nie ma jednak żadnej praktycznej różnicy. Łącznik linuksowy nie będzie zauważalnie wolniejszy, dopóki nie dojdziesz do 20-40 połączonych bibliotek i tysięcy symboli do rozwiązania.

2

Pliki wykonywalne gcc i g ++ są po prostu frontendami, nie są faktycznymi kompilatorami. Obydwa te programy uruchamiają kompilatory C lub C++ (oraz ld, ar, wszystko, co jest potrzebne do wygenerowania danych wyjściowych, o które prosiłeś) w oparciu o rozszerzenia plików. Otrzymasz dokładnie taki sam wynik. G ++ jest powszechnie używany w C++, ponieważ łączy się ze standardową biblioteką C++ (iostreams itp.).

Jeśli chcesz skompilować kod C, jak C++, albo zmienić rozszerzenie pliku, lub zrobić coś takiego:

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

Więc co mówisz, jeśli próbuję skompilować kod c jako C++, może to zająć więcej czasu niż kompilacja kodu c? – itsaboutcode

+0

Nie wiem. Ale ponieważ kompilator C++ oczywiście musi być bardziej złożony, wydaje się to prawdopodobne. Prawdopodobnie zajmie dużo kodu, aby zobaczyć różnicę. Możesz to wypróbować. – torhu

+1

man gcc: * "g ++ to program, który wywołuje GCC i traktuje pliki .c, .h i .i jako pliki źródłowe C++ zamiast plików źródłowych C, chyba że -x jest używane" *, więc jest to błędne. –

24

Po pierwsze: Pytanie (i niektórych innych odpowiedzi) wydają się być oparte na błędne założenie, że C jest ścisłym podzbiorem C++, co w rzeczywistości nie ma miejsca. Kompilowanie C jako C++ to , a nie to samo, co kompilowanie go jako C: może zmienić znaczenie twojego programu!

C będzie najczęściej kompilowany jako C++, a większość da takie same wyniki, ale są pewne rzeczy, które są jawnie zdefiniowane, aby nadać inne zachowanie.

Oto prosty przykład - jeśli to jest twój a.c:

#include <stdio.h> 

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

następnie kompilacji jak C daje jeden wynik:

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

i kompilacji jak C++ da inny wynik (chyba, że używa się nietypowej platformy, na której int i char są tego samego rozmiaru):

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

ponieważ specyfikacja C definiuje literał znaków, który ma typ int, a specyfikacja C++ definiuje go jako typ char.

Po drugie: gcc i g++ nie są "tym samym kompilatorem". Używany jest ten sam kod końca, ale przednie końcówki C i C++ to różne fragmenty kodu (gcc/c-*.c i gcc/cp/*.c w źródle gcc).

Nawet jeśli przylgniesz do części języka, które są zdefiniowane do robienia tego samego, nie ma gwarancji, że interfejs frontowy C++ przeanalizuje kod dokładnie w ten sam sposób, co przedni koniec C (np. ten sam sygnał wejściowy do zaplecza), a zatem brak gwarancji, że wygenerowany kod będzie identyczny. Tak więc z pewnością możliwe jest wygenerowanie szybszego kodu niż w niektórych przypadkach - chociaż wyobrażam sobie, że potrzebujesz złożonego kodu, aby mieć jakąkolwiek szansę na znalezienie różnicy, ponieważ większość optymalizacji i generowania kodu magia dzieje się na wspólnym zapleczu kompilatora; a różnica może być różna.

+0

+1. Dla tych, którzy mogą być zainteresowani bardziej szczegółowymi informacjami na ten temat, istnieje mnóstwo różnic na tle wspaniałego przykładu postaci. David R. Tribble przeprowadził dobre badania na ten temat, które można znaleźć [tutaj] (http://david.tribble.com/text/cdiffs.htm). Wikipedia ma również artykuł "[Zgodność C i C++] (http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B)", który również jest przydatny. –

Powiązane problemy