다음과 같은 단일 연결 목록 구현을 고려하십시오.
struct node {
std::unique_ptr<node> next;
ComplicatedDestructorClass data;
}
이제 std::unique_ptr<node> head
인스턴스를 사용하지 않고 범위를 벗어난 소멸자를 호출 한다고 가정 해보십시오 .
이것이 충분히 큰 목록에 대해 내 스택을 날려 버립니까? 이 공정은 컴파일러 (인라인 꽤 복잡 최적화를 할 것이라고 가정하는 것입니다 unique_ptr
'로 소멸자를 node
내가 할 경우 이후 다음 (더 힘들어 얻을 수있는, 다음의'꼬리 재귀를 사용) data
소멸자 당황 것 next
'의 하드를 만들기 컴파일러가 잠재적 재정렬 및 테일 콜 기회를 알 수 있도록) :
struct node {
std::shared_ptr<node> next;
ComplicatedDestructorClass data;
}
data
어떻게 든 그것의 포인터가 있다면 node
꼬리 재귀가 불가능할 수도 있습니다 (물론 캡슐화의 위반을 피하기 위해 노력해야 함).
일반적으로 어떻게하면이 목록을 어떻게 파괴해야합니까? 공유 포인터에는 release
! 가 없으므로 목록을 탐색하고 "현재"노드를 삭제할 수 없습니다 . 유일한 방법은 사용자 정의 삭제 도구를 사용하는 것입니다.
gcc -O3
있는 것은 꼬리 재귀를 최적화 할 수 없었습니다 (복잡한 예에서).