对象如何存储在堆中?

一个对象如何存储在堆中。 例如,可以像这样定义自行车类:

public class Bicycle {

   public int gear;
   public int speed;

   public Bicycle(int startSpeed, int startGear) {
       gear = startGear;
       speed = startSpeed;
   }

   public void setGear(int newValue) {
       gear = newValue;
   } 

   public void applyBrake(int decrement) {
       speed -= decrement;
   }

   public void speedUp(int increment) {
      speed += increment;
   }   
}

那么我可以创建一个自行车对象:

Bicycle bicycle = new Bicycle(20,10)

那么这个自行车对象应该堆放在一起。 但我不明白堆是如何精确地存储这些实例变量和方法,如速度和齿轮。我明白堆应该实现为树。 那么这个对象如何存储在树中? 同样,当你使用bicycle.speed来查找速度值时,复杂度会是多少?


想要别人来做你的CS作业吗? ;)

根据不同的语言,确切的实现将会有所不同(它如何存储在内存中),但一般的概念是一样的。

你有你的堆栈内存和你的堆内存,局部变量和参数放在堆栈上,每当你有new东西进入堆中。 它被称为堆栈,因为当你声明它或调用一个函数时,值被推到它上面,然后弹出并且超出范围。

                    +--------------+
|              |    |              |
|              |    |              |
|              |    |              |
|              |    |              |
|              |    |              |
|              |    |              |
+--------------+    
     Stack                Heap

每个实例变量都会占用其类型所占用的大量内存(取决于语言),编译器会将其全部添加,这就是类型的sizeof (àla C ++)。 方法进入代码空间,并没有得到new进入对象(我认为现在你最好不要考虑如何组织内存,只是把它想象成魔术)。

所以在你的例子中:

Bicycle bicycle = new Bicycle(20,10)
  • bicycle是堆内存地址的一个参考,今天在大多数语言/系统中,它将花费您32或64位的堆栈空间。
  • new内存分配在堆中。 编译器计算出Bicycle的大小,并创建汇编/机器代码来分配它需要的内存量。
  • 这就是内存在这条线之后的样子:

                        +--------------+
    |              |    | Bicycle obj  |
    |              |    |--------------|
    |              |    |              |
    |              |    |              |
    |--------------|    |              |
    | bicycle ref  |    |              |
    +--------------+    
         Stack                Heap
    

    更具体地说,因为Bicycle类有两个实例变量(或者它们在Java中调用的字段)并且都是int ,并且Java中的int是32位或4字节,所以Bicycle对象的大小是4字节* 2字段= 8个字节。

                       +-------------+
    |             |   0| gear        | 
    |             |   4| speed       |
    |             |    |-------------|
    |             |   8|             |
    |-------------|  12|             |
    | bicycle=0x4 |    |             |
    +--------------+    
         Stack                Heap
    

    访问存储器的时间复杂度是O(1)。 编译器能够计算出确切的speed内存地址,因为对象中的第二个int字段位于自行车+ 0x4处。


    Bicycle bicycle = new Bicycle(20,10)
    

    参考自行车将被存储在stack而对象和实例变量将被存储在heapheap的地址被分配到堆栈中,因此意味着堆栈将链接到堆。


    首先,你应该从Java方面理解Object的含义。

    对象只不过是堆中的一个缓冲区(内存区域)。 该缓冲区或内存区域称为对象。

    Object包含该类的所有非静态数据成员。

    一切-

    对象存储在堆中。

    静态数据成员存储在Class Area中。

    参考变量存储在Stack中。

    方法(静态或非静态)存储在方法区域中。

    内存区域

    链接地址: http://www.djcxy.com/p/82833.html

    上一篇: How is an object stored in heap?

    下一篇: What's the relationship between those two “heaps”?