2010-07-21 13 views
7

Digamos que he escrito un programa en C y lo compilé con gcc y g ++, ¿qué compilación se ejecutará más rápido? gcc o g ++? Creo que la compilación de g ++ lo hará lento, pero no estoy seguro de ello.Diferencia de rendimiento entre gcc y g ++ para el programa C

Permítanme aclarar mi pregunta nuevamente debido a una confutación sobre gcc.

Digamos que compilo el programa a.c de esta manera en la consola.

gcc a.c 

g++ a.c 

que a.out funcionará más rápido?

+0

Puede que le interese consultar http://shootout.alioth.debian.org/u32q/c.php que compara muchos idiomas que ejecutan programas similares. Resulta que hay algunas cosas en las que C es más rápido y algo de C++ es más rápido en, pero las diferencias son bastante menores. – jsl4tv

Respuesta

-1

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

GCC es una colección de compiladores. Se utiliza principalmente para la compilación de C, C++, Ada, Java y muchos más lenguajes de programación. G ++ es una parte de la colección de compiladores gnu (gcc).
Quiero decir que gcc también incluye a g ++. Cuando usamos gcc para la compilación de C++, usa g ++. Los archivos de salida serán diferentes porque el compilador G ++ usa su propia biblioteca de tiempo de ejecución.

Edit: Bien, para aclarar las cosas, porque tenemos un poco de confusión al nombrar aquí. GCC es la colección de compiladores de GNU. Puede compilar Ada, C++, C y mil millones y medio de otros idiomas. Es un "back-end" para los diversos lenguajes compiladores "front-end" como GNAT. Ve a leer el enlace que hice en la parte superior de la página de GCC.GNU.Org.

GCC también se puede referir al C Compiler GNU. Esto compilará el código C++ si se le da el comando -lstdC++, pero normalmente se ahogará y morirá porque no está tirando de las bibliotecas C++.

G ++, el compilador C++ de GNU, como el compilador GNU C, es una interfaz de la colección de compiladores GNU. La diferencia entre el compilador de C es que incluye automáticamente esas bibliotecas y hace algunos otros ajustes pequeños, porque supone que se va a alimentar con código de C++ para compilar.

Aquí es donde proviene la confusión. ¿Esto aclara un poco las cosas?

+2

Los he visto producir diferentes ensambles en el mismo código C. –

+4

Eso no es del todo cierto. Las secciones .dynstr, .rodata y .eh_frame son significativamente diferentes en mi programa de prueba trivial. El código ejecutable tiene un trampolín adicional (_gxx_personality_v0 @ plt) y ordena algunas cosas de forma ligeramente diferente en la versión de g ++. No tendrá un impacto significativo en el tiempo de carga, pero no es idéntico. – nmichaels

+0

De acuerdo con la documentación, GNU GCC y GNU G ++ son uno y lo mismo. Si producen un código diferente, investigaré y enviaré esa información al FSF para que revisen la documentación. – Caladain

2

Creo que ambos producirán el mismo código de máquina, y por lo tanto la misma velocidad en su computadora.

Si quiere saber más, puede compilar el conjunto para ambos y comparar los dos, pero apuesto a que crean el mismo conjunto y, por lo tanto, el mismo código de máquina.

+0

Lo que estoy pensando es que g ++ generará más instrucciones en ensamblaje, por lo que puede tomar más tiempo que gcc? – itsaboutcode

+3

@itsaboutcode: * ¿Por qué? * Simplemente ejecútelo dos veces y compare el resultado si está tan preocupado. – GManNickG

+7

Estoy convencido de que existe una relación inversa entre la experiencia en programación y el nivel de preocupación sobre la optimización. –

2

Haz un perfil y pruébalo. Estoy seguro de que dependerá del código real, incluso si se requiere un caso potencialmente extraño para obtener un bytecode diferente. Aunque si no tiene extern C {} alrededor de su código C, o funciona bien en C, no estoy seguro de cómo "compilarlo como si fuera C++" podría proporcionar cualquier velocidad, a menos que ocurran las optimizaciones del compilador en particular en g ++ para que sea un poco mejor para su situación particular ...

2

El código de máquina generado debe ser idéntico. La versión de a.out de g ++ probablemente se vinculará en un par de bibliotecas de soporte adicionales. Esto hará que el tiempo de inicio de a.out sea más lento por unas pocas llamadas al sistema.

Sin embargo, en realidad no existe ninguna diferencia práctica. El enlazador de Linux no se volverá notablemente más lento hasta que llegue a 20-40 bibliotecas vinculadas y miles de símbolos para resolver.

2

Los ejecutables gcc y g ++ son solo frontends, no son los compiladores reales. Ambos ejecutan los compiladores C o C++ reales (y ld, ar, lo que sea necesario para producir el resultado que solicitaste) en función de las extensiones de archivo. Entonces obtendrás exactamente el mismo resultado. G ++ se usa comúnmente para C++ porque se vincula con la biblioteca estándar de C++ (iostreams, etc.).

Si desea compilar código C como C++, o bien cambiar la extensión del archivo, o hacer algo como esto:

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

Entonces, ¿qué dices si trato de compilar el código c como C++, puede tomar más tiempo que la compilación de código c? – itsaboutcode

+0

No lo sé. Pero dado que el compilador C++ naturalmente tiene que ser más complejo, parece probable. Sin embargo, probablemente se necesitaría mucho código para ver la diferencia. Podrías probarlo. – torhu

+1

man gcc: * "g ++ es un programa que llama a GCC y trata los archivos .c, .h y .i como archivos fuente de C++ en lugar de archivos de código fuente C a menos que se use -x" *, por lo que es incorrecto. –

24

En primer lugar: la cuestión (y algunas de las otras respuestas) parecen estar basadas en la premisa errónea de que C es un subconjunto estricto de C++, que de hecho no es el caso. La compilación de C como C++ es y no lo mismo que compilarlo como C: ¡puede cambiar el significado de su programa!

C compilará en su mayoría como C++, y en su mayoría dará los mismos resultados, pero hay algunas cosas que son explícitamente definidas para dar un comportamiento diferente.

Aquí está un ejemplo sencillo - si este es su a.c:

#include <stdio.h> 

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

continuación, compilar como C dará un resultado:

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

y compilar como C++ dará un resultado diferente (a menos que está utilizando una plataforma inusual donde int y char tienen el mismo tamaño):

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

porque la especificación C define un carácter literal para tener el tipo int, y la especificación C++ lo define como de tipo char.

En segundo lugar: gcc y g++ no son "el mismo compilador". Se usa el mismo código de fondo, pero los frontales C y C++ son diferentes piezas de código (gcc/c-*.c y gcc/cp/*.c en la fuente de gcc).

Incluso si se apega a las partes del lenguaje que están definidas para hacer lo mismo, no hay garantía de que la interfaz C++ analizará el código exactamente de la misma manera que la interfaz C (es decir, dando exactamente la misma entrada al back end), y por lo tanto no hay garantía de que el código generado sea idéntico. Por lo tanto, es posible que uno podría generar código más rápido que el otro en algunos casos, aunque me imagino que necesitaría código complejo para tener alguna posibilidad de encontrar una diferencia, ya que la mayor parte de la optimización y la generación de código la magia ocurre en el back-end común del compilador; y la diferencia podría ser en cualquier sentido.

+0

+1. Para aquellos que puedan estar interesados ​​en obtener más detalles sobre este tema, hay un montón de diferencias además de un ejemplo de personaje brillante. David R. Tribble hizo una buena investigación sobre esto que se puede encontrar [aquí] (http://david.tribble.com/text/cdiffs.htm). Wikipedia tiene un artículo llamado "[Compatibilidad de C y C++] (http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B)" que también es útil. –

Cuestiones relacionadas