- 680 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 13:31:21.41 ID:PbE4ojLD0.net]
- >>656
> だからどんなケースなんだよ 探してやったぞ。 > 実験によれば 6-13% の実行時間が単なる関数のディスパッチに用いられ、オーバーヘッドは場合によって 50% に達する[1]。 > https://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E9%96%A2%E6%95%B0%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB C++は動的な型の変更はなしなので、コンパイル時に対象関数は確定するだろ。それが仮想関数であってもね。 だからvtblを用いた実装自体がコンパイラの単純さを採って、実行速度を捨ててる。 JavaScriptみたいに、実行時に型を変更してしまえる言語ではないのだから、 型毎にテーブルを持つこと自体が冗長で、 テンプレートみたいに、仮想関数が上書きされた毎時点で平面的に展開し、直接それを呼ぶ実装も出来るんだよ。 勿論オブジェクトコードは膨らむが。 Cの場合は、どちらでやるにしても「自前で」実装するしかない。だから当然、選べる。 C++の場合は、選べないでしょ。一般的にvtblの実装になる。(コンパイラの都合だが)
|

|