Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Performance difference between gcc and g++ for C program

Tags:

c

gcc

g++

Lets say I have written a program in C and compiled it with both gcc (as C) and g++ (as C++), which compiled executable will run faster: the one created by gcc or by g++? I think using the g++ compiler will make the executable slow, but I'm not sure about it.

Let me clarify my question again because of confusion about gcc:

Let's say I compile program a.c like this in the terminal:

gcc a.c

g++ a.c

Which a.out executable will run faster?

like image 652
itsaboutcode Avatar asked Jul 21 '10 18:07

itsaboutcode


People also ask

Should I use GCC or G ++ for C?

gcc is used to compile C program while g++ is used to compile C++ program. Since, a C program can also be compile complied through g++, because it is the extended or we can say advance compiler for C programming language.

Is G ++ faster than GCC?

It won't have a significant impact on load time, but it isn't identical. According to the documentation, GNU GCC and GNU G++ are one and the same.

Is GCC good for C?

Though there are many compilers available for C, GCC stands out to be one of the best as of now.

Which is the fastest C compiler?

The Zapcc is the fastest compiler in our compile test. LLVM and Clang have relatively good documentation, although it can be somewhat unclear as to which version of the product the documentation refers to. The Zapcc compiler relies entirely on the standard LLVM documentation.


6 Answers

Firstly: the question (and some of the other answers) seem to be based on the faulty premise that C is a strict subset of C++, which is not in fact the case. Compiling C as C++ is not the same as compiling it as C: it can change the meaning of your program!

C will mostly compile as C++, and will mostly give the same results, but there are some things that are explicitly defined to give different behaviour.

Here's a simple example - if this is your a.c:

#include <stdio.h>

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

then compiling as C will give one result:

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

and compiling as C++ will give a different result (unless you're using an unusual platform where int and char are the same size):

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

because the C specification defines a character literal to have type int, and the C++ specification defines it to have type char.

Secondly: gcc and g++ are not "the same compiler". The same back end code is used, but the C and C++ front ends are different pieces of code (gcc/c-*.c and gcc/cp/*.c in the gcc source).

Even if you stick to the parts of the language that are defined to do the same thing, there is no guarantee that the C++ front end will parse the code in exactly the same way as the C front end (i.e. giving exactly the same input to the back end), and hence no guarantee that the generated code will be identical. So it is certainly possible that one might happen to generate faster code than the other in some cases - although I would imagine that you'd need complex code to have any chance of finding a difference, as most of the optimisation and code generation magic happens in the common back end of the compiler; and the difference could be either way round.

like image 133
Matthew Slattery Avatar answered Oct 03 '22 23:10

Matthew Slattery


I think they they will both produce the same machine code, and therefore the same speed on your computer.

If you want to find out, you could compile the assembly for both and compare the two, but I'm betting that they create the same assembly, and therefore the same machine code.

like image 42
KLee1 Avatar answered Oct 03 '22 21:10

KLee1


Profile it and try it out. I'm certain it will depend on the actual code, even if it would require potentially a really weird case to get any different bytecode. Though if you don't have extern C {} around your C code, and or works fine in C, I'm not sure how "compiling it as though it were C++" could provide any speed, unless the particular compiler optimizations in g++ just happen to be a bit better for your particular situation...

like image 32
eruciform Avatar answered Oct 03 '22 23:10

eruciform


The machine code generated should be identical. The g++ version of a.out will probably link in a couple of extra support libraries. This will make the startup time of a.out be slower by a few system calls.

There is not really any practical difference though. The Linux linker will not become noticeably slower until you reach 20-40 linked libraries and thousands of symbols to resolve.

like image 26
Zan Lynx Avatar answered Oct 03 '22 22:10

Zan Lynx


The gcc and g++ executables are just frontends, they are not the actual compilers. They both run the actual C or C++ compilers (and ld, ar, whatever is needed to produce the output you asked for) based on the file extensions. So you'll get the exact same result. G++ is commonly used for C++ because it links with the standard C++ library (iostreams etc.).

If you want to compile C code as C++, either change the file extension, or do something like this:

gcc test.c -otest -x c++
like image 41
torhu Avatar answered Oct 03 '22 21:10

torhu


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

GCC is a compiler collection. It is mainly used for compilation of C,C++,Ada,Java and many more programming languages. G++ is a part of gnu compiler collection(gcc).
I mean gcc includes g++ as well. When we use gcc for compilation of C++ it uses g++. The output files will be different because the G++ compiler uses its own run time library.

Edit: Okay, to clarify things, because we have a bit of confusion in naming here. GCC is the GNU Compiler Collection. It can compile Ada, C++, C, and a billion and a half other languages. It is a "backend" to the various languages "front end" compilers like GNAT. Go read the link i made at the top of the page from GCC.GNU.Org.

GCC can also refer to the GNU C Compiler. This will compile C++ code if given the -lstdc++ command, but normally will choke and die because it's not pulling in the C++ libraries.

G++, the GNU C++ Compiler, like the GNU C Compiler is a front end to the GNU Compiler Collection. It's difference between the C Compiler is that it automatically includes those libraries and makes a few other small tweaks, because it's assuming it's going to be fed C++ code to compile.

This is where the confusion comes from. Does this clarify things a bit?

like image 24
Caladain Avatar answered Oct 03 '22 22:10

Caladain