2014-02-22 4 views
1

CRTP에서 도움을 요청할 수 있습니다 (기본 질문 일 수 있습니다. 유감입니다). 이것은 다음과 같은 글을 기반으로합니다 CRTP를 사용 C++ object lifetime profiling How to count the number of CRTP subclasses of a template class?C++ : CRTP : 모든 개체 수를 계산하는 방법은 무엇입니까?

, 우리는 할 수 각 클래스 유형에 대해 만든 개체의 수를 계산 할 수 있습니다. 그러나이 방법을 사용하면 시스템에서 생성 된 총 개체 수를 찾을 수 없습니다.

이것을 달성 할 방법이 있습니까?

미리 감사드립니다. 당신이 필요하지 않은 모든 인스턴스를 계산 원하는대로

감사합니다,

+1

이 질문 자체에 포함 된 확인하십시오. –

+0

당신은 단일 또는 다중 스레드 프로그램입니까? –

+0

@Mateusz Grzejek, 지금은 싱글 스레드 용으로하고 싶습니다. 그러나 미래의 요구 사항은 다중 스레드 일 수 있습니다. 당신이 말했듯이, 이것은 객체 프로파일 정보를 유지하고 객체 크기와 다른 객체 관련 정보를 추가하기위한 것입니다. – SNR

답변

1

이 솔루션에는 (클래스 별 및 전역) 카운터에 대한 코드가 들어 있습니다.

extern size_t Global_counter; //In .cpp file define it: size_t Global_counter = 0; 

template <class T> 
class CountedClass 
{ 
protected: 
    static size_t this_class_counter; 

public: 
    static size_t GetThisClassCounter() 
    { 
    return this_class_counter; 
    } 

    static size_t GetGlobalCounter() 
    { 
    return Global_counter; 
    } 

    CountedClass() 
    { 
    ++this_class_counter; 
    ++Global_counter; 
    } 
}; 

template <class T> 
size_t CountedClass<T>::this_class_counter = 0; 

샘플 사용 :

class A : public CountedClass<A> 
{ 
public: 
    A() : CountedClass<A>() 
    { 
    } 
}; 

class B : public CountedClass<B> 
{ 
public: 
    B() : CountedClass<B>() 
    { 
    } 
}; 

A a1; 
A a2; 
B b2; 

std::cout<<A::GetThisClassCounter(); //prints 2 
std::cout<<A::GetGlobalCounter(); //prints 3 

std::cout<<B::GetThisClassCounter(); //prints 1 
std::cout<<B::GetGlobalCounter(); //prints 3 
+0

+1 좋은 해결책!클래스에서'GetGlobalCounter'에 대한 getter를 제외하면 (너무 어렵지 않아야합니다) 더 좋을 것입니다. –

+0

감사합니다. 클래스 내에서 GetGlobalCounter()를 제거하려면 문제없이 수행 할 수 있습니다. 전역 함수로 만듭니다. 그러나 그 이유는 무엇입니까? 샘플 코드를 보면 더 직관적 인 IMO가됩니다. 전역 카운터는 독립 실행 형 변수가 아니라 각 클래스의 일부로 취급합니다. 그러나 이것은 맛의 문제입니다, 나는 생각한다. –

+0

그런 경우를 위해 어떤 종류의 클래스 특성 카테고리 액세스 포인트를 도입하는 것이 유용 할 수있다. –

0

모든 수업을 SNR은

class Counter { 
    static int count = 0; 

protected: 
    Counter() { count++; } 

public: 
    int getCount() { return count; } 
}; 

같은 공통 기본 카운터를 유지 클래스, 뭔가 상속 서로 다른 파생 클래스를 구분하기 위해 CRTP가 필요하지 않습니다.

두 카운트 모두를 원하면 위의 클래스를 CRTP 클래스의 기본 클래스로 사용할 수 있습니다.

+0

제공된 예제에서 각 클래스는 이미'Counted' 클래스를 상속받습니다. 따라서이 솔루션은 다중 상속을 도입합니다. 이러한 상속은 단순한 작업에는 필요하지 않습니다. 프로필 정보 일 뿐이므로 방해가되지 않는 방법을 선택해야합니다. –

+0

다중 상속을 사용하는 것이 좋을 것이라고 제안하지 않았습니다. 내 클래스를 클래스 템플릿의 기본 클래스로 사용하는 것이 전역 변수를 사용하는 것보다 방해가 적고 캡슐화 된 방법이 좋습니다. 침입하고 싶지 않다면 기본 클래스가 아닌 메모리 분석기를 사용하십시오. –

+0

@Nicola Musatti, 코드를 보내 주셔서 대단히 감사합니다. 나는 파생 클래스 객체가 생성되고 그 클래스 이름 (정말로 객체 이름과 관련이 있기를 원함)과 함께 파기되었을 때를 말할 수있는 클래스를 찾고 있었다. 따라서 qn은 첫 번째 링크에서 객체 프로파일 링을위한 것입니다. 객체에 대한 정보를 보유하고 싶다면 CRTP가 좋다고 느꼈습니다. CRTP와 함께 Bcz는 클래스 이름을 얻을 수 있으며 클래스가 만들어지고 파괴되고 크기가되면 말할 수 있습니다. – SNR

관련 문제