2014-03-13 2 views
3

개체가 힙에 정확히 저장되는 방법. 예를 들어, 자전거 클래스는 다음과 같이 정의 할 수 있습니다 :개체는 힙에 어떻게 저장됩니까?

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을 사용하여 속도 값을 찾을 때 시간 복잡도는 어떻게됩니까? 대상물과 인스턴스 변수 heap에 매장되고 힙의 주소가 너무 스택 힙을 링크 할 것이라고하는 의미 스택에 할당되는 반면

+0

가능한 복제본 [스택 및 힙은 무엇이며 어디에 있습니까?] (http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap) – EkoostikMartin

+0

@fge I 힙을 트리로 구현해야 함을 이해하십시오. 그래서 그 객체가 나무에 어떻게 저장되어 있습니까? – Jude

+0

힙은 거대한 바이트 배열입니다. 객체는 구조체입니다. 단일 엔티티로 처리되고 함께 할당되는 일련의 필드입니다. 객체를 생성하려면 적절한 크기의 "자유"힙을 찾고 객체 헤더 (클래스 및 기타 "부기"정보에 대한 포인터)를 설정하고 클래스에 설명 된 초기화를 수행하십시오. –

답변

4

다른 사람이 생겨서 당신의 CS의 숙제를 원하십니까? ;)

언어에 따라 정확한 구현 (메모리에 저장되는 방식)은 다르지만 일반적인 개념은 동일합니다.

스택 메모리와 힙 메모리가 있습니다. 로컬 변수와 매개 변수가 스택에 저장되고, new 뭔가가 있으면 힙에 들어갑니다. 값을 선언하거나 함수를 호출 할 때 값이 푸시되고 스택이 꺼져 범위를 벗어나기 때문에 스택이라고합니다.

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

각 인스턴스 변수는 유형이하는 그러나 많은 메모리 (언어에 따라)를 차지, (일품 C++) 컴파일러는 모두를 추가하고 그것은 sizeof 유형입니다. 메소드는 코드 공간에 들어가서 객체에 넣지 않습니다. (지금 생각하면 메모리가 어떻게 구성되어 있는지 배우는 것에서 이것을 고려하지 않는 것이 좋을 것입니다. 단지 그것을 마법이라고 생각하십시오).그래서 예에서

:

Bicycle bicycle = new Bicycle(20,10) 
  • bicycle는 스택에 당신이 중 하나를 32 및 64 비트 비용을 것입니다 대부분의 언어/시스템의 힙 메모리 주소, 오늘에 대한 참조입니다.
  • new은 힙에 메모리를 할당합니다. 컴파일러는 Bicycle의 크기를 파악하고 필요한 메모리 양을 할당하는 어셈블리/기계 코드를 만듭니다. , 자전거 클래스는 두 개의 인스턴스 변수가 있기 때문에

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

    보다 구체적으로, (또는 필드를 그들이 자바에서 호출 될 때) 모두가 int의이 :

이 메모리가이 선 후 모습입니다 Java에서 int은 32 비트 또는 4 바이트이고 Bicycle 객체의 크기는 4 바이트 * 2 필드 = 8 바이트입니다.

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

메모리에 액세스하는 데 소요되는 시간 복잡도는 O (1)입니다. 객체의 두 번째 int 필드가 bicycle + 0x4에 있기 때문에 컴파일러는 speed의 정확한 메모리 주소를 파악할 수 있습니다.

+0

설명해 주셔서 감사합니다, 윌! "힙 (heap)"이라고도하는 하나의 데이터 구조로 인해 혼란스러워졌습니다. http://stackoverflow.com/questions/1699057/why-are-two-different-concepts-both-called-heap이 링크는 나를 너무 많이 돕습니다. 회원 함수가 어디에 저장되어 있습니까? 그들은 또한 힙에 저장되어 있습니까? – Jude

+0

멤버 함수가 스택에 저장됩니다. @ 주드 – Kick

+0

그래, 힙 ADT는 완전히 다릅니다. 모든 것이 이해되기 전에 더 낮은 수준의 컴퓨터 아키텍처에서 더 많은 지식을 구축해야한다고 생각합니다. 1. 실제 코드 (바이트 코드 또는 어셈블리)는 다른 위치의 코드 공간에 저장됩니다. 2. 매개 변수 값은 현재 줄 포인터가 이동하기 전에 스택에 밀어 넣어집니다 (일부 콜백/반환 메모리 주소가있는 경우 혼자). 3. 힙의 객체는 파괴 될 때까지 그대로 유지됩니다. 참조 위의 그림은 실제로 메모리 주소의 int입니다. –

1
Bicycle bicycle = new Bicycle(20,10) 

기준 자전거stack에 저장 될 것이다.

+0

참조가 스택에 있음을 이해합니다. 개체가 힙에 정확히 저장되는 방법을 모르겠습니다. – Jude

0

우선 Java의 관점에서 Object의 의미를 이해해야합니다.

개체는 힙의 버퍼 (메모리 영역) 일뿐입니다. 해당 버퍼 또는 메모리 영역을 Object라고합니다.

Object에는 클래스의 모든 비 정적 데이터 멤버가 포함됩니다. 힙

모든 the-

개체에 저장합니다.

정적 데이터 멤버는 클래스 영역에 저장됩니다.

참조 변수는 스택에 저장됩니다.

메소드 (정적 또는 비 정적) 메소드 영역에 저장합니다.

Memory Area

관련 문제