2013-06-18 2 views
4

POD 유형 및 스택에서 할당되고 초기화되는 방식을 이해하려고합니다. 는 사용자 정의 클래스 객체의 스택 할당

class A { 
public: 
    A(); 
    int x; 
}; 

class B { 
public: 
    int x; 
}; 

int func() 
{ 
    A a; 
    B b; 
} 

을 감안할 때 나는 그러나 이전에 초기화 한 후 그 B가 할당 말에 수정이 있습니까? 즉, 은 공백이 선언 된 순서대로 b에 대해 할당되지만 b는 초기화 될 때 공백이 할당되고 선언 될 때 초기화 될 때를 의미합니까?

나는 포드에 대한 아주 좋은 FAQ를 읽고 그가 말한 것들 중 What are Aggregates and PODs and how/why are they special?

하나는 여기 집계 : 생성자가 완료되면 비 POD 클래스 형식의 개체 수명이 시작 언제 종료 소멸자가 끝났습니다. POD 클래스의 경우 객체의 저장 공간이 사용되면 수명이 시작되고 해당 저장 공간을 릴리스하거나 다시 사용할 때 수명이 종료됩니다.

그래서 POD가 할당되고 초기화되는 방식과 이것이 비 POD와 다른 의 세부 정보를 이해하려고합니다.

+0

실제로 이것은'A :: A()'에 대한 정의가 없기 때문에 링크하지 않습니다. 그렇게했다면'A'는 사용자 제공 기본 생성자를 가지고 있기 때문에 POD가 아닙니다. –

+0

예, 의사 코드입니다. B는 꼬투리이고 A는 아닙니다. –

+0

아, 맞아. 알았어. 음, 객체가 정의되기 전에 수명이 시작될 수 없습니다. 객체 정의에 "저장 공간이 확보되었습니다"라는 사실이 내재되어 있습니다. 그 전에 메모리가 존재했다는 사실은 중요하지 않습니다. –

답변

9

번호 a이 할당되고 초기화되고, b이 할당되고 초기화됩니다. C++ 프로그램은 명령문별로 실행됩니다. 메모리가 이기 때문에 자동으로, 어쨌든 일어나지 않는 명시 적 할당은 없습니다. 자동으로 처리됩니다.

은 (예를 들어, 데스크톱 운영 체제에서 사용되는 일반적인 호출 스택 구현에서, 메모리는 항상있어왔다 모두에 할당 할 필요가 없다, 단지 주소.)

2

당신은 제로가 A 및 B가 할당 된 메모리의 주문에 대한 모든 종류의 보증.

만약 A와 B 모두가 생성자를 가지고 있다면, a는 b보다 먼저 호출 될 것입니다. 그러나 당신이 묻는 POD 유형 (그리고 B가 무엇인지)은이 구문으로 전혀 초기화되지 않으므로 의문의 여지가 있습니다.

저장소가 할당되었을 때와 관련된 개체 초기화의 질문은 어쨌든별로 의미가 없습니다. 예를 들어, 여기에있는 대부분의 컴파일러는 단일 스택 포인터 이동에서 A와 B에 대한 공간을 할당합니다. 순응하는 C++ 프로그램이 그런 것을 탐지 할 수있는 방법이 없다는 것을 감안할 때, 컴파일러는 원하는대로 할 수 있습니다.

0

이들은 로컬 개의 변수이며 상식적으로는 "할당"되어 있지 않으므로 해당 변수가 있다고 간주 할 수 있습니다. (구현 방법은 일반적으로 프로세서 지원 스택을 사용하는 것이지만,이 경우 모든 로컬 객체에 대한 모든 스토리지는 기능 항목에서 스택에 저장됩니다.

초기화는 항상 선언 된 순서대로 이루어집니다. 여기에 A :: A()가 호출되면 B :: B()가 호출됩니다.

관련 문제