本文参考自加州伯克利 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)