In a word, symbols.
The C++ standard library introduces a lot of symbols to your program, since most of the library exists primarily in the header files.
Recompile your program in release mode and without debug symbols, and you can easily expect the program to be significantly smaller. (Smaller still if you strip symbols.)
As a quick demonstration of this fact, observe:
$ cat hello.c
#include <stdio.h>
int main() {
printf("%s\n", "Hello, world!");
return 0;
}
$ cat hello.cpp
#include <iostream>
int main() {
std::cout << "Hello, world!\n";
return 0;
}
$ gcc hello.c -o hello-c
$ g++ hello.cpp -o hello-cpp
$ gcc hello.c -ggdb -o hello-c-debug
$ g++ hello.cpp -ggdb -o hello-cpp-debug
$ gcc hello.c -s -o hello-c-stripped
$ g++ hello.cpp -s -o hello-cpp-stripped
$ gcc hello.c -s -O3 -o hello-c-stripped-opt
$ g++ hello.cpp -s -O3 -o hello-cpp-stripped-opt
$ ls -gG hello*
-rwxr-xr-x 1 6483 Nov 14 15:39 hello-c*
-rw-r--r-- 1 79 Nov 14 15:38 hello.c
-rwxr-xr-x 1 7859 Nov 14 15:40 hello-c-debug*
-rwxr-xr-x 1 7690 Nov 14 15:39 hello-cpp*
-rw-r--r-- 1 79 Nov 14 15:38 hello.cpp
-rwxr-xr-x 1 19730 Nov 14 15:40 hello-cpp-debug*
-rwxr-xr-x 1 5000 Nov 14 15:45 hello-cpp-stripped*
-rwxr-xr-x 1 4960 Nov 14 15:41 hello-cpp-stripped-opt*
-rwxr-xr-x 1 4216 Nov 14 15:45 hello-c-stripped*
-rwxr-xr-x 1 4224 Nov 14 15:41 hello-c-stripped-opt*
I can't explain why a Windows build of the programs with G++ produces such large executables, but on any other platform, symbols are the primary driving factor in large file sizes. I don't have access to a Windows system at the moment, so I can't test.