C++에서 멤버 변수 값 또는 포인터를 만드는 점은 무엇입니까? 예를 들어 다음 코드에서 pThread와 thread의 차이점은 무엇입니까?멤버 포인터와 멤버 값 저장
class A {
public:
boost::thread *pThread;
boost::thread thread;
}
C++에서 멤버 변수 값 또는 포인터를 만드는 점은 무엇입니까? 예를 들어 다음 코드에서 pThread와 thread의 차이점은 무엇입니까?멤버 포인터와 멤버 값 저장
class A {
public:
boost::thread *pThread;
boost::thread thread;
}
차이점은 개체의 메모리 레이아웃입니다.
구성원 항목은 구조적으로 순차적으로 저장되며 연속적으로 메모리에 저장됩니다 (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 바이트는 실제 성적을 저장하는 메모리의 다른 위치에 할당됩니다.
또한 액세스하는 방법도 있지만 중요한 것은 레이아웃입니다. –
형식적으로 멤버 포인터가있을 때 멤버가 가리키는 개체는 가리키는 개체의 수명주기에 따라 살아 있지 않습니다. 포인터가 가리키는 오브젝트는 NULL 일 수 있습니다. 새 인스턴스를 통해 필요할 때 인스턴스를 만들고 더 이상 필요하지 않을 때 인스턴스를 지울 때 (삭제를 통해) 인스턴스를 작성해야합니다.
포인터 대신 멤버 인스턴스가 있으면 인스턴스는 부모의 생성자가 실행될 때 만들어지고 부모의 소멸자가 실행될 때 소멸됩니다.
포인터를 통해 개체를 가져 오는 경우 해당 개체는 다른 여러 개체간에 공유 될 수 있으므로 포인터를 보유한 개체가 반드시 뾰족한 개체를 제어하는 개체 일 필요는 없습니다.
포인터는 사용자가 무언가를 할당 한 메모리 주소의 이름입니다. 따라서 고정 크기 (예 : Intel x86 아키텍처에서는 32 비트)입니다. 즉, A
개체를 만들 때 boost::thread
이 실제로 위치 할 메모리 주소를 저장하기 위해 pThread
필드는 항상 32 비트를 차지합니다. 그것이 A
개체가 만들어 스택 내부의 boost::thread
만큼 큰 저장 공간을 차지할 수 있도록
당신이 포인터를 사용하지 않는 경우
는boost::thread
는
A
객체의 일부로서 전체에 생성됩니다.
포인터를 관리하는 것보다 포인터가 아닌 변수를 사용하는 것보다 복잡 할 수 있습니다. 누군가 포인터를 올바른 주소로 가리키고 메모리 누수가 발생하지 않도록 다른 사람이 boost::thread
에 대한 메모리를 할당하고 할당을 해제해야합니다. .
사실 나는 포인터와 값의 차이점을 알고 있는데, 내 질문은 이것에 불분명했다 :) – Erik
글쎄, pThread는 포인터입니다 ;-) –