2016-04-17 10 views
13

vtablesを使用するコンパイラの実装では、実行時に仮想関数のテーブルが変更されることはありますか?または、コンパイル時にvtableのみが満たされ、実行時に変更するアクションは実行されませんか?実行時のVtableの変更

+2

どのような種類の実行時の変更が有用であると考えられていますか? –

+2

@ Cheersandhth.-Alfもしそれが普通のC++プログラムであれば、それは愚かです。彼が(今も将来も)VMやInterperter/JITコンパイラのようなものを書かなければならないのであれば、私は彼の質問をすばやく捨てないだろう。 –

+0

そのようなデザインを思いつくのは非常に難しいスレッドセーフなので、実行されていません。 –

答えて

8

実行時に変更される仮想テーブルを使用する多態性の実装では、C++ ABIについて認識していません。

仮想テーブルは通常、コードのプロパティ(クラス階層内のメンバー関数の互いのw.r.t位置の関係)を記述し、C++コードは実行時に変更されないため、あまり役に立ちません。

有用ではないため、無駄です。

+0

vtablesは実行可能イメージのコードセクションまたはデータセクションに移動しますか? –

+2

@KarolisM ilieška:どの実装ですか?なぜあなたは知る必要がありますか? –

+0

具体的には、ARM Keilですが、これはgccアームにも当てはまります。 1.私はちょうど混乱しています。2.私は組込みシステムで作業しますが、時にはいくつかのセクションを配置する場所を知る必要があります。 –

2

短い答えはノーです。

派生クラスのオーバーライドされたメソッドが実行されないように、派生多相クラスのコンストラクタとデストラクタの実行中にオブジェクトの実際のvtableへのポインタが変更される派生クラスがまだ構築されていない/破壊されている間、基本クラスのコンストラクタ/デストラクタによって呼び出されます。

あなたがオブジェクトが実行時にクラスを変更したい場合、あなたは多くのオプションを持っている:

  1. Objective-Cの(++)

  2. 手コード、独自のディスパッチメカニズム

  3. python/javascriptなど。

  4. (最適なオプション)はデザインを再考します。

+1

変更するのはvtableではありません。それは破壊されているオブジェクトのvptrメンバーです! –

+0

また、 'std :: function'は実行時に再割り当てすることができるので、これは別のオプションです –

+0

@KerrekSBは固定されていますが、より良い表現があると確信しています。 –

関連する問題