我几个月来一直在练习汇编编程作为业余爱好,但我的面向对象的思维一直在询问如何在RAM中组织类。
编译器是否有任何格式用于存储ROM中的类?它如何在RAM中创建所述类的实例?那么它如何知道如何使用类,如数据类型长度? - 由于我没有线索,所以很难提出这么多问题。
我不是在询问内存管理或数据组织,我想知道如何在汇编中解释类(因为所有事情必须最终),如何创建和访问实例。
我意识到在程序集中编程对象是不切实际的,但我仍然想知道计算机如何知道对象是什么'是
答案 0 :(得分:2)
因此,假设您为结构(类)分配了一块内存。你有一个指向它的指针,我们称之为struct *x
。现在,您可以写信给它:x->foo = 10
,或者从中if (struct->bar) baz();
读取。
对于真机,这可能看起来像:
mov 10, 4(%reg) # where %reg holds the pointer to the struct's first member,
# and .foo was 4 bytes (say, an int) into the struct
mov 8(%reg), %reg # where %reg holds the pointer to x,
# .bar is 8 bytes from the first member of the struct
test %reg, %reg
je otherstuff
call baz
答案 1 :(得分:1)
在Java中(采取相当大的自由) -
首先要明白,"对象"之间存在差异。和一个"类"。让我们来讨论一个"对象" (例如,String对象)首先:
对象由"垃圾收集堆"中分配的字节组成。通常,对象分配将从16字节边界开始(尽管一些JVM可能使用8,大约32)。可能存在16-32位某种标识符,用于标识有效对象并在GC扫描期间提供帮助,或者可能不是。之后(或者,首先,如果没有标识符)通常是指向对象类结构的指针。 (这是指向C struct
或C ++对象的指针,而不是Java对象。)可能还有大约8个字节左右的数据用于处理GC,执行对象锁定以及其他一些任务
之后是实际的对象数据。在String中,它包含指向String的char
数组的指针和String的长度。在旧版本中还有一个偏移值,因为作为另一个字符串的子字符串的字符串可以"分享"它的char
数组。但是新版本并没有这样做。
在某个地方,无论是在标题中还是在对象数据中,都将是一个包含对象哈希值的字段。这通常最初保持为零,并在首次引用哈希值时计算。
数组对象将具有"对象数据"它实际上由数组长度后跟实际数组字节组成。 (尽管在某些情况下,数组长度字段使用对象标头中的可用空间。)
类 struct
(或C ++对象)包含有关该类的大量信息。最重要的部分是:
toString()
将是,例如,条目#7。然后,比方说,如果这是Double
的类,Number
(Double
的超类)的方法将出现在表格中,然后是Double
本身的方法。这样,如果你有一个声明为Number
的指针,那么无论对象的实际类型如何,JVM都会知道调用#19条目来调用shortValue()
。Class
的实例的指针(它只是一个像String实例的对象是一个对象)。 Class
实例只包含少量值,最值得注意的是long
值,实际上是指向C / C ++类结构的指针。