개체가 서로를 참조하지 않으면 수동 참조 카운팅을 시도해 볼 가치가 있습니다. 목록에 추가하거나 목록에서 제거 할 때 더 많은 비용이 들지만 실제 개체 액세스에는 오버 헤드가 없습니다. (잘못했을 때 진단하는 것은 고통 스러울 수 있으므로 올바르게 진행하는 것이 좋습니다.)
작업 사이에 불감 시간이 있으면 일종의 가비지 수집을 고려하십시오. 모든 객체의 목록을 유지 관리하십시오 (방해하지 않는 목록이 아마도 수행 할 것입니다). 시간을 할애 할 때 다른 목록과 교차 참조하십시오. 목록에없는 모든 개체는 삭제 될 수 있습니다. 이 작업을 수행하기 위해 여분의 배열 (각 개체의 전역 카운터 및 마지막 카운터)이 필요하지 않으므로 효율적입니다.
또 다른 옵션은 기본 포인터에 대한 액세스를 제공하는 스마트 포인터를 사용하는 것입니다. 과부하가 걸리는 오버 헤드를 피하려고한다면 operator->
을 많이 사용하는 것이 좋습니다. 목록에 스마트 포인터를 저장하면 (수명 관리를 수행함) 객체를 실행할 때 각각의 원시 포인터를 검색하고이를 사용하여 작업 할 수 있습니다 (오버로드 된 오버 헤드가 발생하지 않도록 operator->
등).). 예 :
std::vector<smart_ptr<T> > objects;
if(!objects.empty()) {
smart_ptr<T> *objects_raw=&objects[0];
for(size_t n=objects.size(),i=0;i<n;++i) {
T *object=objects_raw[i].get_ptr();
// do stuff
}
}
이것은 개인적으로 선호하는 방식입니다.장기 저장은 스마트 포인터를 가져오고 단기 저장은 일반 포인터를 얻습니다. 객체 수명은 관리하기 쉽고, 1,000,000 개의 작은 오버 헤드가 발생하지 않습니다 (디버그 빌드를 릴리스 빌드보다 실행 가능한 상태로 유지하는 것이 중요하지만 그럼에도 불구하고 낭비되는 시간을 쉽게 추가 할 수 있습니다).
스마트 포인터를 사용해보십시오. 너무 많은 영향을 미치는지 확인하는 프로필. 기회는 너무 많지 않을 것이며, 대부분의 자신 만의 솔루션보다 적을 것입니다. – sje397
불행히도 할 수있는 일이별로 없습니다. 책임을 정의해야합니다. 즉 책임자는 리소스를 소유해야합니다. 제 견해로 이것은 C++의 근본적인 문제이며 사람들이 다른 언어로 옮겨가는 가장 큰 이유 중 하나 일 것입니다. –
스마트 포인터를 프로파일 링 했습니까? 아니면 그냥 추측입니까? – Simone