$ /usr/share/misc/config.guess
x86_64-unknown-linux-gnu
$ cat h.cpp
#include <iostream>
int main () {
std::cout << "hello, world\n";
}
$ size h
text data bss dec hex filename
2030 608 296 2934 b76 h
That's with GCC 4.3.3, no optimization, stripping the executable after compiling it.
The problem with mingw is that it doesn't yet support linking to libstdc++ dynamically. Even if you manage to build an executable that appears to link to it dynamically, it still includes a bunch of code statically anyway. Hence the apparent bloat in your executable.
The definition of 'improper' and 'proper' really do depend on your exact requirements. On a PC, who cares if you are linking to one more library that is already on the target system? If you are developing code to run on a GBA then yes, you probably don't want the overhead you mention. But even the DS? That has 4 MB of RAM. That is a lot! If using features from libstdc++ means that you finish your program faster, then you have more time to debug it, and add extra features, etc.