编译器如何处理引擎下的接口?

时间:2017-11-16 19:00:47

标签: assembly interface compiler-construction

在较高的层面上,我理解界面是一种说法

  

这样做,我不在乎

换句话说,它基本上允许您以声明方式而不是命令式进行编程。如果部分代码可以告诉其他部分该做什么,而不是如何做,那么您可以使代码更加灵活。

当谈到像Java这样的高级语言时,我理解了这个概念。

但是,我很好奇编译器如何处理接口。这可能是一个比我意识到的更大的问题。

这是我的理论:它基于RAM中的偏移量。

例如,当创建一个实现包含ICompare方法的Compare接口的对象时,编译器知道将Compare方法置于16字节偏移量该对象在RAM中的起始位置。实际上,实现ICompare方法的每个对象在第16个字节都有Compare方法。这样,当其他代码使用该接口调用Compare方法时,系统知道在该对象的第16个字节处执行指令。

编译器是如何处理接口的(使用每个对象中的标准位置)还是使用某种查找表来了解对象的Compare方法的位置?还是其他一些方法?

1 个答案:

答案 0 :(得分:0)

对于对此问题感兴趣的任何人,here是一个优秀的视频,可视化解释vtable如何在C ++中实际实现。对象的前四个字节可以指向vtable,该vtable指向用于该特定类的正确方法。

感谢@sircodesalot提示。