2009-07-10 3 views
2

사람들은 대개 주위에 큰 물체 목록을 복사하는 것을 어떻게 관리합니까?C++ std :: list <> ..에 큰 데이터를 저장하면 참조 카운팅을 사용해야합니까?

typedef std::vector<float> Image; 

와 나는 Image.size()가 매우 크고있는

std::list<Image> lst; 

에 저장하고 있습니다 (각 :

가 현재 나는이있다 : 여기

내 상황입니다 ~ 3-5 MB).

나는 목록을 전달 (복사 중)하고 있습니다.

std :: vector는 각 요소를 값으로 복사합니다. 그렇다면 과도한 복사로 인해 약간의 성능이 저하 될 수 있습니다.

복사를 최소화하려면 어떻게해야합니까? 내가 대신

std::list<ImageRef> lst; 

typedef boost::shared_ptr<Image> ImageRef; 

를 저장해야 하는가?

이런 종류의 문제를 처리하는 우아한 방법은 무엇입니까?

+3

나는 당신이 당신의 자신의 질문에 대답했다고 생각합니다. 문제를 다루기위한 멋진 우아한 방법을 제공합니다. shared_ptr <> 기술은 거의 확실한 방법입니다. –

답변

5

내장 된 유형보다 큰 객체는 참조 및 값별로 전달하는 것이 가장 저렴합니다. 그래서 당신의 물건이 약 3 메가 정도라면, 그것을 지나쳐야합니다. 그것을 복사하지 마십시오!

모든 STL 유형은 값 의미를 사용합니다. 즉, 내용을 복사합니다. 포인터의 내용이있을 수 있습니다. 이 경우 포인터는 참조되는 내용이 아닌 복사됩니다.

참조로 이미지 목록을 전달하는 것이 좋습니다. 많은 스마트 포인터 복사를 저장하므로 많은 참조 횟수 관리를 저장하고 많은 잠금/잠금 해제를 저장할 수 있습니다.

3

나는 이 목록이 복사 될 때 복사되지 않는 것이 중요하지 않은 한 boost::shared_ptr 경로가 좋은 접근이라고 생각합니다. 복사를 최소화 할 수 있지만 참조 계산은 마지막 목록이 삭제 된 경우에도 작업을 정리합니다.

1

첫째,

typedef std::list<Image> ImageList; 

당신은 단지 그것을 조작, 하나 개의 목록 작업에 필요한 경우,의 ImageList 자체에 대한 참조를 전달할 것입니다. 그렇게 아무것도 복사 할 필요가 없습니다. 원래 목록을 유지하고 사본을 만들려면 boost :: shared_ptr을 사용하십시오.

2

부스트를 살펴 보지 마십시오. pointer container. boost :: shared_ptr을 복사하는 것은 저렴하지만 그렇게 싸지는 않습니다. 참조 횟수는 무료가 아닙니다. 복사 작업을 많이하고 개별 Image 객체를 공유 할 필요가 없다면 Boost 포인터 컨테이너가 더 좋습니다.

관련 문제