2012-01-28 3 views
1

C++에서 멤버 변수 값 또는 포인터를 만드는 점은 무엇입니까? 예를 들어 다음 코드에서 pThread와 thread의 차이점은 무엇입니까?멤버 포인터와 멤버 값 저장

class A { 
public: 
    boost::thread *pThread; 
    boost::thread thread; 
} 
+2

글쎄, pThread는 포인터입니다 ;-) –

답변

4

차이점은 개체의 메모리 레이아웃입니다.

구성원 항목은 구조적으로 순차적으로 저장되며 연속적으로 메모리에 저장됩니다 (2-4-8 바이트 정렬이 가능하지만 그렇지 않으면 순차적으로 순차적으로 저장 됨). 포인터는 메모리 주소에 4/8 바이트 포인터로 저장되는 반면 실제 객체는 메모리의 아무 곳에 나 저장할 수 있습니다.

는 구조체의 크기는 7 바이트 당신이 구조체를

struct grades { 
    unsigned char math; 
    unsigned char english; 
    unsigned char history; 
    unsigned char physics; 
    unsigned char chemistry; 
    unsigned char biology; 
    unsigned char computers; 
}; 

이 상황을 생각해 보자.

class Student_member { 
    unsigned long id; 
    struct grades _grades; 
}; 

및 클래스 Student_pointer :

class Student_pointer { 
    unsigned long id; 
    struct grades *_grades; 
}; 

그런 클래스 Student_member의 메모리 크기는 4 + 7 = 11 바이트 것 (긴 이제 클래스 Student_member이있는 경우

Student_pointer 클래스의 메모리 크기는 4 + 4 = 8 바이트 (long + 포인터)이고 다른 7 바이트는 실제 성적을 저장하는 메모리의 다른 위치에 할당됩니다.

+0

또한 액세스하는 방법도 있지만 중요한 것은 레이아웃입니다. –

1

형식적으로 멤버 포인터가있을 때 멤버가 가리키는 개체는 가리키는 개체의 수명주기에 따라 살아 있지 않습니다. 포인터가 가리키는 오브젝트는 NULL 일 수 있습니다. 새 인스턴스를 통해 필요할 때 인스턴스를 만들고 더 이상 필요하지 않을 때 인스턴스를 지울 때 (삭제를 통해) 인스턴스를 작성해야합니다.

포인터 대신 멤버 인스턴스가 있으면 인스턴스는 부모의 생성자가 실행될 때 만들어지고 부모의 소멸자가 실행될 때 소멸됩니다.

포인터를 통해 개체를 가져 오는 경우 해당 개체는 다른 여러 개체간에 공유 될 수 있으므로 포인터를 보유한 개체가 반드시 뾰족한 개체를 제어하는 ​​개체 일 필요는 없습니다.

1

포인터는 사용자가 무언가를 할당 한 메모리 주소의 이름입니다. 따라서 고정 크기 (예 : Intel x86 아키텍처에서는 32 비트)입니다. 즉, A 개체를 만들 때 boost::thread이 실제로 위치 할 메모리 주소를 저장하기 위해 pThread 필드는 항상 32 비트를 차지합니다. 그것이 A 개체가 만들어 스택 내부의 boost::thread만큼 큰 저장 공간을 차지할 수 있도록

당신이 포인터를 사용하지 않는 경우

boost::threadA 객체의 일부로서 전체에 생성됩니다.

포인터를 관리하는 것보다 포인터가 아닌 변수를 사용하는 것보다 복잡 할 수 있습니다. 누군가 포인터를 올바른 주소로 가리키고 메모리 누수가 발생하지 않도록 다른 사람이 boost::thread에 대한 메모리를 할당하고 할당을 해제해야합니다. .

+0

사실 나는 포인터와 값의 차이점을 알고 있는데, 내 질문은 이것에 불분명했다 :) – Erik