2011-07-17 2 views
0

저는 연습용으로 그래픽 엔진을 개발하기 시작했습니다. 발생 된 첫 번째 질문 중 하나는 핸들 또는 스마트 포인터를 사용하여 클래스 인스턴스를 참조하는 것입니다.핸들 대 스마트 포인터. 무엇을 사용할 것인가?

  • 스마트 포인터의 장점 : 내 관점에서

    수요에 따라 생성, 그들은 오래된 포인터를지고의 문제가 없습니다; 단점 : 링크 된 목록에 있으므로 포인터를 검색하는 것은 O (n) 작업입니다.

  • 처리 프로 : 검색은 O (1), 개체 재배치는 O (1)입니다. cons : 쓸모없는 포인터가 될 수 있습니다. 새 핸들을 만들면 시스템이 핸들 테이블의 첫 번째 NULL 항목을 확인합니다.

어느 것이 고르겠습니까? 선택 사항을 설명하십시오.

편집 :

나는 여러분의 의견과 답변 후 몇 가지 점을 명확히하고자합니다.

스마트 포인터가 "STL 링크 목록으로 표시됩니다"라는 방식으로 연결된 목록이라는 것은 아닙니다. 즉, 어떤 식 으로든 링크 된 목록으로 동작한다는 것입니다 (하나의 메모리 블록에서 다른 객체로 한 객체를 이동하는 경우 스마트 포인터의 전체 목록을 반복하여이 객체에 대한 모든 참조를 제대로 업데이트해야 함). 연결된 목록 -).

그리고 정확하게 불투명 포인터 또는 구현 모델에 대한 포인터와 같은 핸들을 의미하지는 않습니다. 개체를 요청할 때 전역 핸들 테이블 (포인터 배열)을 사용하면 개체에 대한 실제 포인터를 찾을 수있는이 테이블의 인덱스를 포함하는 참조 해제 가능한 인스턴스가 생깁니다. 그래서, 한 블록에서 다른 블록으로 객체를 옮기면 핸들 테이블의 포인터 엔트리를 업데이트하면 동시에 모든 포인터가 자동으로 업데이트됩니다.

+4

"핸들"이라는 용어를 사용할 때 정확히 염두에 두어야 할 점이 무엇인지 자세히 설명해 주시겠습니까? –

+1

또한 정확히 "포인터 검색"이란 의미는 무엇이며 스마트 포인터가 연결된 목록에 저장되는 이유는 무엇입니까? – interjay

+0

@davidcm : 보통 'handle'은 장치 나 파일을 처음 열어 호출 한 후 식별자로 사용되는 불투명 한 엔티티 (어쩌면 포인터)를 의미합니다. 어떤 종류의'handle'을 참조하고 있는지 확실하지 않습니다 이리. –

답변

2

일반적으로 사용되는 정의와 일치하지 않습니다. 스마트 포인터는 링크 된 목록에 전혀 없습니다. 일반적으로 관찰자 패턴을 사용하여 반복 포인터를 반복 할 필요가있는 경우 여전히 존재하는 객체에 원시 포인터 벡터를 유지합니다. 설명하는 핸들은 바이너리 호환성을 이유로 사용되며 프로세스 중에는 사용되지 않습니다.

스마트 포인터를 사용하면 그들은 스스로 처리합니다.

1

"핸들"이라는 용어는 본질적으로 객체에 대한 식별자를 의미하는 광범위한 용어입니다..

포인터 또는 스마트 포인터는이 정의에 해당, 그래서 당신은 몇 가지 고정 메모리 추상화 "다른 식별자"를 의미한다고 가정하면 당신은 당신의 옵션 2.

   "Handle" 
       | 
      /------+-------\ 
     /  |   \ 
     /  |   \ 
    Pointer Reference Other Identififer 
     |   |    \ 
    |----+----| `T&`    \ 
    |   |     |---+------| 
`T*` `shared_ptr<T>`  Text  Number (e.g. HWND in WinAPI) 

에 대한 terser 용어를 선택해야합니다 그럼, 확실히 이것을 사용할 수 있습니다. 꼭 여기에/또는 시나리오가있는 것은 아닙니다. 어쨌든 스마트 포인터 을 사용하고 싶다면 (평생 관리를위한 경우) 및 스마트 포인터가 이 아니어야합니다. 연결된 목록에이 있어야합니다.

사용자 정의 식별자를 [잠재적으로 변경 될 수있는] 스마트 포인터에 매핑하려면 std::map<your_identifier_type, std::shared_ptr<T> >을 사용할 수 있습니다.


면책 조항 :이 그림은 급하게 그려과 30 분 침대에서받은 후, 지금의 약자로 용어 트리의 내 비전을 표현했다. 다른 견해와 경미한 불일치가있을 수 있지만 상당히 신뢰할만한 인상을 주어야합니다.

관련 문제