2017-02-06 14 views
0

トピックに記載されています。Win32、WinMain対カスタムエントリーポイント(膨大なサイズの違い)、なぜですか?

WinMainや他のデフォルトエントリーポイントを使用すると、Cアプリケーションは70kbに似ていることに気付きました。

しかし、私はちょうどカスタムエントリーポイントを指定する場合は、 "RawMain"、と言う、RawMain()。 ファイルは6kbのようになります。

私は不思議に思っていますが、なぜこれがファイルに追加/参照されますか? サイズに若干の違いがあることが分かりましたが、空のアプリケーションではその違いが大きいです。

ありがとうございます!

+0

ビルド元は何ですか?ビルド手順は何ですか? – andlabs

+0

私自身のソースですが、基本的に単純なWin32ウィンドウで十分です。 ウィンドウハンドル、MessageLoopなど 私は間違っているかもしれませんが、私は深さのテストはしていませんが、サイズの違いの原因を簡単に伝えることができると思いました。私は多くのものがファイルで参照され、実装されていると仮定することができます(リリースビルドモードでも)。それは、どこかで私が個人的に使うのではないことを意味します。 注目に値するのは静的ライブラリです。だから私はWinMainがCRLの多くを追加するか何かを強制すると推測しています。 – Zerowalker

答えて

3

ほとんどの環境でWindows用にビルドする場合、実際のプログラムエントリポイントは小さなランタイムライブラリの関数によって提供されます。これは、いくつかの環境準備を行い、main、wmain、WinMainなどのユーザが提供する関数を呼び出します。

ユーザが提供するメイン関数の前に実行されるコードには、グローバルC++コンストラクタの実行、TLS変数の有効化、標準的なライブラリ呼び出しがマルチスレッド環境で適切に動作し、標準のロケールを設定するなど、グローバルな相互排他性を提供します。

エントリーポイントを設定することの1つは、エントリーポイントに付けた名前の未定義のシンボルでリンカーを開始することです。たとえば、mingw32を使用している場合、リンカーはリンクする必要があると仮定しますlibmingw32.aと未定義の記号__tmainCRTStartupとの間にある。

リンカはlibmingw32.aで(たぶん)__tmainCRTStartupを見つけ、余分な大きさはどこから来るのであるcrtexe.oから発せられる未定義のシンボルを満たすために必要な何か、と一緒に、それを含むオブジェクトファイルcrtexe.oが含まれます。

独自のエントリポイントを設定するときは、これをオーバーライドし、指定した関数を探すようにリンカを設定するだけです。より小さな実行可能ファイルが得られますが、使用している機能がランタイムの起動機能によって実行されるグローバル初期化に依存しないように注意する必要があります。

+0

私は何を注意するべきであるかの例を挙げることができますか? HInstanceなどの入力パラメータを他の場所で取得できるためです。 しかし、私はあなたが他のものについて話していると推測しています。 (知っておくと便利なので、私は地雷を踏まないでください)。 また、独自のエントリポイントを使用する場合、アプリケーションが完全に閉じないと思われるので、ExitProcessを使用することになっていますか。 – Zerowalker

+0

標準的なCロケール関数を使用して、スレッドローカルストレージで定義されたグローバルが意味のある値を指していると仮定し、マルチスレッド環境の標準Cライブラリからstrtokを使用します。それらは私がWindows上のCに影響を与えると考えることができるものです。 –

+0

ああ、よく受け入れられた答え、明確化のために感謝:)! – Zerowalker

関連する問題