C/C++コンパイラが作る.exeのサイズ(2) 1998.May.5, Oct.14
VC4.0 付属の\MSDEV\SAMPLES\SDK\WIN32\GENERICのコンパイル結果。
exeサイズ順にソートしてあります。
「DLLを使用しない」コンパイル(スタティック・リンク)
Visual C++ 4.0: 27,136 bytes (28,672 bytes)
Visual C++ 5.0 SP3: 33,792 bytes (38,912 bytes)
Watcom C++ 11.0: 34,304 bytes
Borland C++ 5.01: 40,960 bytes
#VCの場合、()内はマルチスレッド対応ライブラリをリンクした場合のサイズ
「共有DLLを使う」コンパイル
Visual C++ 5.0 SP3: 12,800 bytes (+ MSVCRT.DLL: 277,776 bytes)
Watcom C++ 11.0: 13,312 bytes (+ CLBR110.DLL: 207,872 bytes)
gcc 2.8.1: 13,824 bytes (+ CRTDLL.DLL: 161,280 bytes)
Visual C++ 4.0: 14,336 bytes (+ MSVCRT40.DLL: 326,656 bytes)
Borland C++ 5.01: 15,360 bytes (+ CW3220.DLL: 233,472 bytes)
Lcc-Win32 4th: 15,904 bytes (+ CRTDLL.DLL: 161,280 bytes)
CRTDLL.DLLはWindows95付属のもの。だって言語:日本だし……
なお、Lcc-Win32はstripすると15,872 bytesになります。
(しかし。バージョンぐらい付けてくれ〜>Lcc
Lcc-Win32はとりあえず、1998, April版です。後の版の幾つかでコンパイルしても
サイズに変化なかったのでそのままです)
#デフォルトのコンパイルでVC++の.exeサイズが異様にでかかったのはこういうこと
だったのね。共有DLLという視点は全くなかったので盲点でした。
いかんなぁ。>わし
#なお、私が持っているのはgcc/lcc/VC++ 4.0/VC++ 5.0だけです。その他の
コンパイラのデータはNifty, fprog*の参加者の協力を得ました。
いきなりハンドルなど出すと迷惑になるかと思うので、ここには書きません
#ところで、gcc/lccはargvを展開します。つまりa.exe *.*とやるとプログラムには
*.*を展開した、例えばfoo.c readme.txt ...といった引数が渡ります。VC++では
そうならず、"*.*"が来ます。VC++で引数の展開をするには別途リンクする時に
オブジェクトを追加してやらねばなりません。
私のmkmf.batはVC++の場合、そのオプジェクトを追加する行をコメントアウトする
ようにmakefile内に記述します。
__argvを使わない場合.exeのサイズに影響はないですが、こういった細かい、ANSIの
規格外の挙動に付いてはいつまでもプログラマが配慮せねばならないのでしょうね。
悲しいことです(笑)
// Oct.14
#う〜む。VC++5 SP3、思っていたより頑張ってますね。VC++6はどうなんでしょう?
例によってVC++6のバグがNiftyのfcとかfmsdevで報告されてますから、出るであろう
SPx入れないとやっぱりVC++6も使い物にならないみたいですけど。
しかし、どーにかならんのか?MSのバギーな体質。
− 以上 −
なお、この文章のURLは http://www.vector.co.jp/authors/VA006065/c-cpp/gensize.htm です。多分(^^;;