2011-10-27 4 views
-2

클래스 A의 인스턴스를 선언하는 경우 : "A a;" 어떤 종류의 메모리가 만들어 질까요? 다른 유형의 메모리 유형이 있습니까?클래스 인스턴스가 A a?로 선언되면 클래스 인스턴스가 메모리에 위치합니다.

내 솔루션 :

내 위치는 선언 된 위치에 따라 다릅니다. 전역 변수이고 클래스 및 함수 외부에 있으면 힙에 있습니다. 클래스 또는 함수에 있으면 스택에 있습니다. 네임 스페이스에있는 경우 힙에 있습니다.

바로?

답변

2

함수에 로컬 인 경우 스택에 있습니다. 전역 또는 정적 인 경우 실행 파일의 데이터 세그먼트 (AAKA "전역 메모리")에 있습니다. 다른 클래스 내의 선언 인 경우 클래스의 인스턴스가 할당되는 방식에 따라 어느 위치 에나있을 수 있습니다.

네임 스페이스는 아무런 영향을주지 않습니다. 그것은 단지 컴파일러를위한 것입니다.

EDIT re : classes.

class B 
{ 
    A a; 
}; 

다음 a의 메모리 배치는 B의 둘러싸는 인스턴스가 할당되는 방식에 의해 결정된다 : 인스턴스가 A a;을 선언하고,이 선언은 다음과 같이, 클래스 내부에 일어나는 경우

. 예를 들어 B b;의 경우 스택이나 전역 메모리와 같은 규칙이 적용됩니다. 해당하는 경우

B * b = new B();

그러나 A은 나머지 B과 함께 힙에 있습니다.

+0

클래스 내에 선언 된 경우 할당에 영향을 줄 수있는 요소는 무엇입니까? 몇 가지 예를 보여주십시오. thanks – Jack

+0

@Jack이 경우에는 클래스의 특정 인스턴스에 따라 달라지며 다시 동일한 규칙이 적용됩니다. –

+0

또한 컴파일러는 규칙에 따라 행동 한 것처럼 보이는 한 만족스러운 곳으로 물건을 이동할 수 있습니다. 예를 들어, 컴파일러는 힙에 로컬 배열을 배치 할 수 있으며 드물게 전역 메모리를 배치 할 수도 있습니다. –

3

귀하의 질문에 "스택"과 "힙"만 있다고 가정합니다.

함수 또는 클래스/공용체 외부에서 선언 된 모든 변수는 전역 메모리에 있습니다. 이것이 바로 일반적으로 "전역"이라고 불리는 이유입니다. 그 메모리는 실행 파일의 로딩에 의해 생성되고 main이 실행되기 전에 (그리고 소멸자가 main 다음에 호출 됨) 호출되기 전에 해당 클래스에 대한 생성자가 호출됩니다.

함수 내부에서 변수를 선언하면 스택에 변수가 선언됩니다. 뭔가 "힙"에 들어갈 수있는 유일한 방법은 명시 적으로 new을 사용하여 할당하거나 자체적으로 할당 된 다른 객체의 멤버 인 경우입니다.

클래스/유니온의 멤버는 변수가 선언 될 때마다 작동합니다.

관련 문제