内存中的类是什么?

时间:2014-07-21 20:06:34

标签: assembly

我几个月来一直在练习汇编编程作为业余爱好,但我的面向对象的思维一直在询问如何在RAM中组织类。
编译器是否有任何格式用于存储ROM中的类?它如何在RAM中创建所述类的实例?那么它如何知道如何使用类,如数据类型长度? - 由于我没有线索,所以很难提出这么多问题。

我不是在询问内存管理或数据组织,我想知道如何在汇编中解释类(因为所有事情必须最终),如何创建和访问实例。

我意识到在程序集中编程对象是不切实际的,但我仍然想知道计算机如何知道对象是什么'是

2 个答案:

答案 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 ++对象)包含有关该类的大量信息。最重要的部分是:

  • "常数池"包含字符串文字,字段和方法的名称和属性,要链接的外部字段和方法的名称,以及程序使用的其他常量。
  • "虚拟方法表" (可能在不同的JVM中称为几个不同的名称)。该表包含指向可以在类上调用的所有方法的指针,包括超类中的方法。 Object的方法首先在类中,因此在系统的每个类中,方法toString()将是,例如,条目#7。然后,比方说,如果这是Double的类,NumberDouble的超类)的方法将出现在表格中,然后是Double本身的方法。这样,如果你有一个声明为Number的指针,那么无论对象的实际类型如何,JVM都会知道调用#19条目来调用shortValue()
  • 指向类Class的实例的指针(它只是一个像String实例的对象是一个对象)。 Class实例只包含少量值,最值得注意的是long值,实际上是指向C / C ++类结构的指针。
  • 当然还有其他数据 - 调试信息,各种辅助表的指针等等。