Juliaは、ジャストインタイムの静的型の導出に大いに依存していることを理解しています(基本的にすべてのコードはC++テンプレートと考える必要があります)。これは、コンパイル時に型が既知である限り、異なる型のオブジェクトに対して単一のアルゴリズムを使用するときに実行時のオーバーヘッドがないことを意味します。Juliaの実行時ポリモーフィズムのオーバーヘッド
ランタイムポリモーフィズムに関しては、私は物事の仕組みがあまり明確ではありません。ここで
abstract Shape
type Circle <: Shape
radius::Float64
end
type Square <: Shape
width::Float64
end
dist(x::Circle, y::Circle) = ...
dist(x::Circle, y::Square) = ...
dist(x::Square, y::Circle) = ...
dist(x::Square, y::Square) = ...
s = get_shape()
t = get_shape()
a = dist(s,t)
、get_shape
は、いずれかの円や正方形を返すことができ、例えば基づいて:私たちは次のような状況があるとユーザ入力。 C++では、ディスパッチは単純に仮想テーブル検索を行います。 Juliaではどのように機能しますか?複数の発送の仕組みは何ですか?それははるかに高価な仮想テーブルのルックアップですか? Square
とCircle
の両方を同じ抽象タイプから派生させることによる利点はありますか?これは実行時ディスパッチのコンテキストではまったく関係ありませんか?
EDT:この例で実行されている@code_warntypeができます:
Variables:
s::Union{Circle,Square}
t::Union{Circle,Square}
Body:
begin # none, line 2:
s = (Main.get_shape)()::Union{Circle,Square} # none, line 3:
t = (Main.get_shape)()::Union{Circle,Square} # none, line 4:
return (Main.dist)(s::Union{Circle,Square},t::Union{Circle,Square})::ASCIIString
end::ASCIIString
をので、コンパイラは、sとtの種類について完全に無知ではありません。 dist
に電話をするときは、この知識は派遣を迅速にするために使用されていますか?
コンパイル時の型が複合型の連合である場合、私は自分自身を推測しなければならないとしたら、コンパイラは4つの仮想テーブルを生成し、時間ディスパッチはC++に匹敵します。それは正しいと思いますか? – krcools