在抽象级别上,您可以使用您要设计的语言来包含所需的任何内容。
在实现级别上,不可避免的是其中某些事情将更易于实现,某些事情将变得复杂,某些事情将变得更快,某些事情势必会变得更慢,等等。为了解决这个问题,设计人员通常不得不做出艰难的决定和妥协。
在实现级别,我们找到变量的最快方法之一就是找出其地址并加载该地址的内容。大多数CPU中都有特定的指令用于从地址加载数据,这些指令通常需要知道它们需要加载多少个字节(一个,两个,四个,八个等),以及将它们加载的数据放在何处(单个寄存器,寄存器)。对,扩展寄存器,其他内存等)。通过知道变量的大小,编译器可以准确地知道要针对该变量的使用发出哪条指令。通过不知道变量的大小,编译器将需要诉诸更复杂甚至更慢的东西。
在抽象级别上,子类型化的目的是能够使用一种类型的实例,其中期望使用相同或更多的通用类型。换句话说,可以编写期望特定类型对象或任何其他派生对象的代码,而无需事先知道确切的含义。显然,随着更多派生类型可以添加更多数据成员,派生类型不一定具有与其基本类型相同的内存要求。
在实现级别,没有一种简单的方法可以让预定大小的变量保存一个未知大小的实例,并以通常称为有效的方式对其进行访问。但是,有一种方法可以使事物稍微移动一点,并使用变量而不是存储对象,而是识别对象并将该对象存储在其他位置。这种方式就是引用(例如,内存地址)-额外的间接级别,可以确保变量只需要保存某种固定大小的信息,只要我们可以通过该信息找到对象即可。为此,我们只需要加载地址(固定大小),然后就可以使用我们知道有效的对象的偏移量照常工作,即使该对象在未知的偏移量处具有更多数据也是如此。我们可以这样做,因为我们不
在抽象级别,此方法允许您将a(对a的引用)存储string
到object
变量中,而不会丢失使它成为a的信息string
。所有类型都可以像这样正常工作,并且您可能还会说它在许多方面都很优雅。
尽管如此,在实现级别,间接的额外级别涉及更多指令,并且在大多数体系结构上,它使对对象的每次访问都稍微慢一些。如果您在语言中包含一些没有额外的间接级别(引用)的常用类型,则可以允许编译器从程序中挤出更多性能。但是通过消除这种间接级别,编译器将不再允许您以内存安全的方式来子类型化。这是因为,如果您向类型中添加更多数据成员并分配给更通用的类型,则将切掉不适合分配给目标变量的空间的所有其他数据成员。