抽象レベルでは、設計している言語に必要なものを含めることができます。
実装レベルでは、それらのいくつかは実装がより簡単になり、一部は複雑になり、一部は高速になり、一部は低速になります。これを説明するために、設計者はしばしば厳しい決定と妥協をしなければなりません。
実装レベルでは、変数にアクセスするための最も速い方法の1つは、アドレスを見つけてそのアドレスの内容をロードすることです。ほとんどのCPUにはアドレスからデータをロードするための特定の命令があり、それらの命令は通常、ロードする必要があるバイト数(1、2、4、8など)とロードするデータを置く場所(単一レジスタ、レジスタ)を知る必要がありますペア、拡張レジスタ、その他のメモリなど)。変数のサイズを知ることにより、コンパイラはその変数の使用のためにどの命令を発行するかを正確に知ることができます。変数のサイズがわからない場合、コンパイラーはより複雑で恐らくより遅いものに頼る必要があります。
抽象レベルでは、サブタイピングのポイントは、同等またはより一般的なタイプが期待される1つのタイプのインスタンスを使用できるようにすることです。つまり、特定の型のオブジェクトまたはそれ以上の派生物を予期するコードを、事前に正確にこれが何であるかを知ることなく記述できます。そして明らかに、派生型が増えるとデータメンバが追加されるため、派生型のメモリ要件は必ずしも基本型と同じになるとは限りません。
実装レベルでは、事前に定義されたサイズの変数が未知のサイズのインスタンスを保持し、通常は効率的と呼ぶ方法でアクセスされる簡単な方法はありません。しかし、物事を少し動かし、変数を使用してオブジェクトを保存するのではなく、オブジェクトを識別し、そのオブジェクトを別の場所に保存する方法があります。その方法は参照(メモリアドレスなど)です。その情報を介してオブジェクトを見つけることができる限り、変数が何らかの種類の固定サイズの情報のみを保持する必要があることを保証する間接レベルです。そのためには、アドレス(固定サイズ)を読み込むだけで、有効なオブジェクトのオフセットを使用して、そのオブジェクトに不明なオフセットのデータがさらにある場合でも、通常どおり作業できます。私たちはそれを行うことができます
抽象レベルでは、このメソッドを使用すると、aにする情報を失うことなくstring
、object
変数に(a への参照)を格納できますstring
。すべてのタイプがこのように動作することは問題ありませんが、多くの点でエレガントであると言うこともできます。
それでも、実装レベルでは、間接レベルの追加レベルはより多くの命令を必要とし、ほとんどのアーキテクチャでは、オブジェクトへの各アクセスが多少遅くなります。余分なレベルの間接参照(参照)を持たない一般的に使用される型を言語に含めると、コンパイラーがプログラムからより多くのパフォーマンスを引き出すことができます。しかし、そのレベルの間接参照を削除することにより、コンパイラはメモリの安全な方法でサブタイプを許可できなくなります。これは、型にさらにデータメンバーを追加し、より一般的な型に割り当てると、ターゲット変数に割り当てられたスペースに収まらない余分なデータメンバーが切り捨てられるためです。