Object 对象和结构成员访问和地址偏移计算

Object 对象和结构成员访问和地址偏移计算,object,struct,offset,member,memory-access,Object,Struct,Offset,Member,Memory Access,我正在写一个简单的VM,我有一个关于实现对象和结构成员访问的问题 由于程序的开始地址在每次运行时都是任意的,因此其每个对象的地址也都是任意的 因此,我能想到的访问对象或其成员对象的唯一方法是访问“base”指针的偏移量,这意味着访问程序结构中的任何内容都需要一个算术运算 我的问题是,这是否是专业编译器的工作方式,因为这种方法显然会增加运行时的一些开销,我自己也想不出任何方法来从运行时卸载这个过程,因为缺乏对内存分配及其地址一致性的保证?几十年来,大多数计算机都提供寻址模式,允许您将地址指定为基址

我正在写一个简单的VM,我有一个关于实现对象和结构成员访问的问题

由于程序的开始地址在每次运行时都是任意的,因此其每个对象的地址也都是任意的

因此,我能想到的访问对象或其成员对象的唯一方法是访问“base”指针的偏移量,这意味着访问程序结构中的任何内容都需要一个算术运算


我的问题是,这是否是专业编译器的工作方式,因为这种方法显然会增加运行时的一些开销,我自己也想不出任何方法来从运行时卸载这个过程,因为缺乏对内存分配及其地址一致性的保证?

几十年来,大多数计算机都提供寻址模式,允许您将地址指定为基址和偏移量的组合,而实际计算是在硬件中进行的,没有额外的CPU时钟周期成本


最近(过去几十年)的计算机提供了虚拟化内存布局的硬件,这意味着即使在每次运行时项目的物理地址不同,其在虚拟地址空间中的地址也保持不变。同样,使用基址没有额外的成本,因为计算是隐式地、不可见地对程序的执行二进制代码执行的。

谢谢。这个机制是特定于平台的还是有一个标准化的便携解决方案?您能否提供有关如何利用此功能的信息的链接?或者可能是C/C++实现?@ddriver寻址模式是特定于CPU的。C/C++程序员不能直接使用它们-编译器在将代码转换为程序集时会利用它们(至少从PDP-11天起,数组索引就作为基+偏移量进行)。例如,如果您的write
int*p=getPointer();int x=*(p+5)
,大多数编译器将生成一个非常高效的访问,不需要执行五的加法或int大小的乘法。将发出一条CPU指令来执行“基+偏移”寻址。