[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[b-free: 1443] C++ でのコンストラクタ呼び出し




隆一です。


From: Masami Kishida <mkishida@fecsi.furuno.co.jp>
Subject: [b-free: 1440] Re: 例外処理と RTTIの OS でのサポート (Re:オブジェクト指向のOS への適用)
Date: Thu, 23 Apr 1998 13:32:10 +0900

> きしだです。(もうすぐ昼休みも終わり)

詳しい説明、ありがとうございます。


> 
...[snip]...
> 
> ここら辺は スタートアップルーチンにこの部分の記述があるはずです。
> イニシャルの必要な関数をテーブルをにしたものを渡して順にイニシャルを掛け
> ていた物もありました。(コンパイラはこのテーブルを作成しなければならない)
> 
> この例では、各ソースをコンパイルする時に大域変数(オブジェクト)があれば、
> 生成に必要な関数のポインタとパラメータをならべます。
> 最後にリンカはこのテーブルを一つにまとめる処理をしていました。
>     この例ではリンクリストにしていました
> (イニシャルの順序は並んだ順! コードをリンクしていく順とも言う)
> 
> 順序を知る方法は与えられない場合がほとんどです。(無理矢理テーブルを見れば判るけど)
> 
> 実行時には、レジスタ等の初期化をしてテーブルにしたがって生成子を呼んで
> から main に飛びます。
> 戻ってきたらもう一度テーブルにしたがって破壊子を呼びます。
> 例外とか、異常終了時もこのテーブルにしたがって破壊子を呼びます。
> 
> テーブルが壊されたら...いきなり暴走です。
> 
> ここら辺はコンパイラの作者の範囲ですね

そうですね。

私の体験だと、リンカが原因で大域変数のコンストラクタが実行されなかった
ことがありす。

これは、昔の GCC (バージョンが 1.x だったころ) だと、C++ コンパイラは
別になっていた時のことです。どうやら、GNU C++ コンパイラは、大域変数の
処理をリンカと共同して動かしていたみたいで、C++ 用のリンカを作ったとこ
ろうまくいくようになりました(最初は、何がなにやらわからなかった)。

まぁ、古い話ですが、こーゆー経験から C++ は油断ならじと思っていたりし
ます :-)



p----------------------------------------------------------------------q
| FROM R.Night                                                         |
| E-mail:                                                              |
|         rnaitoh@st.rim.or.jp                                         |
| Key fingerprint = 89 EB 77 95 40 C0 3C CC  37 A1 A7 FA 1C 66 FF D0   |
b----------------------------------------------------------------------d