object 的底层实现

  OOP 语言的底层数据结构

Posted by Xiaoran on March 5, 2018

本文参考自加州伯克利 CS 系主任 Alex Aiken 的 Compiler 课程 (已于 Youtube 下架)

1、object 结构

Offset Name 解释
0 Class Tag integer, 指示这个 object 属于哪个 class
4 Object size integer, 这个 object 的总长度是多少 byte
8 Dispatch Pointer 这个 object 对应的 dispatch table (见后文),包含这个 object 所有的 function
12 Attribute 1 这个 object 的第一个 attribute
16 Attribute 2 这个 object 的第二个 attribute
 

2、如何实现 subclass

如果B是 class A的 subclass,那么B的 object 结构就是在A的 object 结构的基础上增加细节

3、具体例子

Class A {
	int a = 0;
	int d = 1;
	int f() {
		return a = a + d;
	}
}

Class B inherits A {
	int b = 2;
	int f() {			// override
		return a;
	}
	int g() {
		return a = a - b;
	}
}

Class C inherits A {
	int c = 3;
	int h() {
		return a = a * c;
	}
}

例子对应的各个 object 结构

class\offset 0 4 8 12 16 20
A A_tag 5 * a d  
B B_tag 6 * a d b
C C_tag 6 * a d c
  • 使用这种结构的原因:
    • 在 runtime,每个 object 都可能有自己不同的 attribute 值,但是 function (dispatch table) 一定是不变的,可以在 compile time 确定

4、object methods 例子

// 继续上文的代码
B e = new B;
e.g()
  • 每个 class 都有有限个 method
  • 通过 dispatch table 来定位这些 method

dispatch table

class\offset 0 4
A f_A  
B f_B g
C f_c h
  • 在每个 class 中,f的位置都是固定的,但是定义不同
  • 调用f的过程就是查表 (dispatch table)