我正在编写一个简单的VM,我对实现对象和结构成员访问有疑问。
由于程序的起始地址在每次运行时都是任意的,因此每个对象的地址也是任意的。
因此,我能想到访问对象或其成员对象的唯一方法是访问“base”指针的偏移量,这意味着需要一个算术运算来访问程序结构中的任何内容。
我的问题是这是否是在专业编译器中完成的方式,因为很明显这种方法会给运行时增加一些开销,而我自己也无法想到任何方法可以从运行时卸载这个过程,因为缺乏保证内存分配的一致性及其地址?
答案 0 :(得分:2)
几十年来,大多数计算机提供的寻址模式允许您将地址指定为基本和偏移的组合,实际计算在硬件中执行,无需CPU时钟周期的额外成本。
最近(过去几十年)计算机提供了用于虚拟化内存布局的硬件,这意味着即使通过项目的物理地址在每次运行中都是不同的,它在虚拟地址空间中的地址保持不变。同样,使用基址没有额外的成本,因为计算是对程序的执行二进制代码进行隐式和不可见的。