12

caml-listの古い投稿を読んで、Jacques Garriguesによる次の投稿に出くわしました:http://caml.inria.fr/pub/ml-archives/caml-list/2007/11/24e8215c8d844b05db58ed3f79c9645f.en.html

私が気にかけている引用は次のとおりです。

任意のオブジェクトに対するメソッド呼び出しは遅くなる可能性があります。これは、サブタイピングが原因で、状況によってはメソッドがテーブルのどこにあるかを知る方法がなく、バイナリ検索を実行する必要があるためです。

なぜこれが当てはまるのか誰かが説明できますか?なぜ正確にサブタイピング(この場合は継承を想定している)がこれに影響を与えているのですか?これはOCamlの実装の場合ですか、それとも他の言語もこれに苦しんでいますか?

これに関するさらなるリソースに私を向けてください、グーグルは私に失敗しました。

4

2 に答える 2

10

OCamlで「サブタイピング!=継承」というデルナンのコメントは、説明への洞察を保持していると思います。

$ rlwrap ocaml
        OCaml version 4.00.1

# let f o = o#x + o#y ;;
val f : < x : int; y : int; .. > -> int = <fun>
# 

上記の関数は、メソッドと。を持つfすべてのオブジェクトを受け入れます。これらのメソッドのオフセットが事前に修正されている可能性のあるクラスから継承するオブジェクトではありません。これらのメソッドを持つすべてのオブジェクト。これを実装するのは難しいと思います。ジャックがメッセージで言及しているケースの1つかもしれません。ox : inty : intc

于 2012-12-09T00:20:02.010 に答える
4

なぜこれが当てはまるのか誰かが説明できますか?

記名的型付けを使用すると、コンパイル時に各メソッドに一意の整数を割り当てることができるため、配列にインデックスを付けることで仮想関数を見つけることができます。構造型(OCamlのように)ではこれを行うことができないため、構造のハッシュ(つまりメソッド名)を使用して、辞書で仮想メソッドの関数ポインターを検索します。

なぜ正確にサブタイピング(この場合は継承を想定している)がこれに影響を与えているのですか?

サブタイプは、仮想ディスパッチの前提条件です。

これはOCamlの実装の場合ですか、それとも他の言語もこれに苦しんでいますか?

OCamlの実装だけです。F#では、リフレクションとランタイムコード生成を使用して、呼び出し時のパフォーマンスに影響を与えることなく同じ効果を実現しました。

于 2013-02-07T18:56:48.223 に答える