this questionは、Cでmain()の前にコードを実行する方法を尋ねました。私は主にアプリケーションの空間に住んでいたので、main()の前に実行することは決して私には起こりませんでした。どのようなことがこの技術を必要としますか?main()の前にどのような操作を行う必要がありますか
答えて
"どのようなことがこの技術を必要としていますか?"
ポイントオブファクト:なし。
しかし、さまざまな理由からメインの前にやりたいことがたくさんあります。具体的な例の1つとして、doohickiesを構築する抽象的な工場があるとします。あなたは工場のインスタンスを構築し、それをある特別な領域に割り当て、それに様々な具体的なdoohickiesを登録することができます...はい、あなたはそれを行うことができます。
一方、ファクトリをシングルトンとして実装し、グローバル値初期化のファクトを使用して実装を「トリック」して、メイン開始前に具体的なdoohickiesを登録すると、わずかなコストでいくつかの利点が得られます。シングルトンを使って、基本的にはここでは問題にはならないが、ほとんど唯一のものだ)。例えば
ます:
すべてを明示的に呼び出す必要があります登録のリストを維持する必要はありません。実際には、クラス全体を宣言して定義することもできます。プライベートスコープでは誰の目にも見えず、プログラムの開始時に使用できるようにします。
main()は気にしないオブジェクトをたくさん入れておく必要はありません。
ので、これのどれも実際に必要ではありません。しかし、メインが始まる前にグローバルが初期化されているという事実を利用すれば、結合とメンテナンスの問題を軽減できます。
編集:
は私がするので、これは言語によって保証されていないことを学んできたことを、ここで注意してください。C++は、が0であることを保証します。または定数 mainの前に初期化が行われます。この回答で私が話しているのは、の動的の初期化です。このC++の保証は、関数ローカルの静的変数によく似た、変数の最初の使用前に行われます。
すべてのコンパイラはメインの前に動的初期化を行っているようですが、私は一度それに遭遇したと思ったが、それは問題の原因が何か他のものだと私は信じている。
+1これは私がこれを持っている唯一の使用ですが、少年は私がそれを使用しますか? –
この手法は、ライブラリ初期化ルーチンや、プログラムの実行中に暗黙的に使用されるデータの初期化に使用できます。
GCCは実行がmain()
またはmain()
完了したかexit()
それぞれ呼ばれているに入る前に、関数が自動的に呼び出される原因となるfunction attributesコンストラクタとデストラクタを提供します。ライブラリが実行時にロードされるか、ライブラリがロード時にロードされている場合main()
前に開始された場合、ライブラリ初期化の場合
void __attribute__ ((constructor)) my_init(void); void __attribute__ ((destructor)) my_fini(void);
は、コンストラクタルーチンはdlopen()
戻る前に実行されます。ライブラリのクリーンアップに使用すると、デストラクタルーチンは、ライブラリが実行時にロードされる場合はdlclose()
が返される前に実行され、exit()
の場合はロードされ、ロード時にロードされる場合はmain()
の完了後に返されます。
ライブラリをお持ちの場合は、main()が呼び出される前にいくつかのデータを初期化したりスレッドなどを作成したり、クライアントアプリケーションに負担をかけずに明示的に信頼することができます。ライブラリの初期化および/またはシャットダウンコードを呼び出します。表面的には、これはコンストラクタとデストラクタが必要な操作を実行する静的オブジェクトを持つことで実現できます。残念ながら、異なる翻訳単位またはライブラリ内の複数の静的オブジェクトは、定義されていない順序で初期化されるため、相互に依存する場合(さらに悪いことに、周期的な方法で)、依頼が到着する前に同様に、1つの静的オブジェクトはスレッドを作成し、まだスレッドセーフではない別のオブジェクトでサービスを呼び出すことがあります。だから、適切なシングルトンインスタンスとロックを持つより構造化されたアプローチが、任意の使用にもかかわらず堅牢性のために必要であり、全体的には魅力的ではありません。メイン前に行わ
スタッフ:x86では
- 、スタック・ポインタ・レジスタは、4(アライメント)の倍数にするために通常& = 0XF3ある
- 静的メンバーは
- プッシュARGCを初期化されARGV(必要に応じて環境)
- コール_main = P
グラム++ 4.4発する以下BEF私のコードはどれも放出されます。技術的にそれは私のコードのいずれかの前に、main
の最上部に挿入し、私はエントリポイントとして_init
の代わり_main
を使用するコンパイラを見てきました:
.cfi_startproc
.cfi_personality 0x3,__gxx_personality_v0
pushq %rbp
.cfi_def_cfa_offset 16
movq %rsp, %rbp
.cfi_offset 6, -16
.cfi_def_cfa_register 6
subq $16, %rsp
movl %edi, -4(%rbp)
movq %rsi, -16(%rbp)
# My code follows
main
が関与する前に、あなたがやりたいことができる唯一のものグローバル変数は悪いです。同じことは、遅延初期化(最初の使用時点での初期化)によって常に達成できます。もちろん、グローバル変数をまったく使用しないことで、よりうまくいくでしょう。
可能性のある「例外」は、実行時のグローバル定数テーブルの初期化です。しかし、これは非常に悪い習慣です。ライブラリー/プロセスのインスタンス間でテーブルを共有することはできません。ビルド時にstatic const
テーブルをCまたはC++ソースファイルとして生成するスクリプトを書く方がずっと賢いです。
main
開始後にコードの不変量を保証するコードを実行する必要があるものは、main
より前に実行する必要があります。
グローバルIostream、Cランタイムライブラリ、OSバインディングなどのようなものは、ほかの人が答えているようなコードを書く必要がありますか?
- 1. なぜerror_reportingでバイナリ操作を行う必要がありますか?
- 2. 私は次の操作を行う必要があり
- 3. は、どのように私は次の操作を行う必要があり、コンテキストメニュー - ポップアップメニュー
- 4. これを行うメソッドの名前はどのようにする必要がありますか?
- 5. Ignited-Datatables、どのように行う必要がありますか?
- 6. 操作の.logs_from()のafter属性の値をどのようにフォーマットする必要がありますか?
- 7. どのようなプロジェクトを作成する必要がありますか?
- 8. なぜcrcを反転させる必要がありますか?どのような場合にはこれを行う必要がありますか?
- 9. システムがmain()を実行する前にどうなりますか?
- 10. RESTful APIにはどのような操作が必要ですか?
- 11. Windowsイベントログの操作にはどのようなオプションがありますか?
- 12. - コードファーストアプローチは、参照テーブル間の削除の操作を行う必要があり
- 13. SVN操作を実行する必要があります
- 14. どのように動作する必要がありますか?
- 15. webpackはどのように動作する必要がありますか?
- 16. パッケージとはどのように動作する必要がありますか?
- 17. WinformsでSlider.AutoToolTipPlacementのような操作を行う方法はありますか?
- 18. は、どのように私は私はこのようなチャートを作成する必要があります#
- 19. 深度に依存しないブレンドをどのように行う必要がありますか?
- 20. 現在のデータフレームのフォーマットを変更する必要があります。私はどのようにこれを行う必要がありますか?
- 21. どのようなタイプのmLoaderManagerは、どのように宣言する必要がありますか?
- 22. すべてのファイル操作はsyscall open()の後に行う必要がありますか?
- 23. %のようなmysqlクエリに注意を払う必要がありますか?
- 24. どのようなVisualStateManagerを使用する必要がありますか?
- 25. どのようなユーザー名を許可する必要がありますか?
- 26. どのようなテストを使用する必要がありますか?
- 27. グラフの最短経路を計算する際に、「リラックス」操作の名前をどのように理解する必要がありますか?
- 28. XMLスキーマにはどのような名前空間を使用する必要がありますか?
- 29. インポート可能な.sqlite永続ストアの名前はどのようにする必要がありますか?
- 30. カスタム挿入動作が必要な場合、RowSorterのカスタム実装を行う必要がありますか?
しないでください。 –
これは面白かったです:http:// stackoverflow。com/questions/4783404/is-main-really-start-of-a-cプログラム – Dave