2013-02-19 3 views
3

X : 내 프로그램의 각 부분에서 사용하는 메모리 양을 알아야합니다. 내 프로그램은 C++ 표준 라이브러리를 많이 사용한다. 특히 각 객체가 사용하는 메모리 양을 알고 싶습니다.std :: containers에 대한 로깅 할당 자?

것은 내가하고 있어요 방법 :은 loggin에 할당이로 구현됩니다

namespace my { 
    template<class T, class S> 
    using vector = std::vector<T,LoggingAllocator<T,S>>; 
} 

은 다음과 위치를 바로

my::vector<double,MPLLIBS_STRING("some_vector")> some_vector; 

쓰기, some_vector의 소비 로그 :

template<class T, class S = MPLLIBS_STRING("unknown")> struct LoggingAllocator { 
    // ... boilerplate ... 

    pointer allocate (size_type n, std::allocator<void>::const_pointer hint = 0) { 
    log_allocation(boost::mpl::c_str<S>::value); 
    // allocate_memory (I need to handle it myself) 
    } 
    void destroy (pointer p) ; // logs destruction 
    void deallocate (pointer p, size_type num); // logs deallocation 
}; 

Que stion : 일반적인 방법으로이 동작을 얻는 더 좋은 방법이 있습니까? 더 나은 내 말함으로써, 간단하게, 더 좋은, boost::mplmpllibs::metaparse에 의존하지 않고, ... 이상적으로 난 그냥

my::vector<double,"some_vector"> some_vector; 

를 작성하고 그것을 함께 할 수 싶습니다.

+0

그건 나에게 꽤 일반적인 것처럼 보입니다. 더 일반적인 것을 원하십니까? – PlasmaHH

+1

질문에 대한 대답은 아니지만 개발자 만 메모리 사용을 알아야하는 경우 전체 코드베이스를 측정하는 것보다 메모리 프로파일 링을 사용하는 것이 좋습니다. – daramarak

+0

@daramarak : 그것은 정말로, 당신이 원하는 것과 당신이 사용할 수있는 도구에 달려 있습니다; 예를 들어, Massif를 좋아하는 한, Production에서 사용할 수있는 것과는 달리 간단한 로거가 가능할 수 있습니다. –

답변

5

모든 할당을 직접 처리하지 않으려면 아마도 "더 일반적인"되지는, 당신은 표준 할당 std::allocator에서 상속 수 있지만 다음 allocate/destroy/deallocate 기능에

template<class T, class S = MPLLIBS_STRING("unknown"), class Allocator = std::allocator<T>> 
struct LoggingAllocator : public Allocator { 
    // ... 
}; 

할 그러나 더 가상이없는 의해 std::allocator 정말 예시, 상속되는 설계되지 않았습니다 있습니다

pointer allocate (size_type n, std::allocator<void>::const_pointer hint = 0) { 
    log_allocation(boost::mpl::c_str<S>::value); 
    return Allocator::allocate(n, hint); 
} 

: 로깅 한 다음 부모의 메소드를 호출 소멸자.

+0

니스! 이것은 나의 경우에 적용되지 않는다. 나는 메모리 할당을 처리 할 필요가있다. 그러나 이것은 로깅 정책을 추상화하는 아이디어를 내게 주었다 : DI는 그것을 간단하게하려고 시도했다 : D – gnzlbg

+5

다른 할당자를 상속 받았다면, 새로운 버전의 'rebind'를 만드는 것이 중요합니다. 할당 자의 유형이 리바운드되면 할당자를 반환합니다. –

+0

할당자를 값으로 복사하기 때문에 가상 소멸자가 부족합니다. 문제. 당신은 슬라이스 될 수 있습니다 (특히 기본 할당자가'rebind'를 정의하고 파생 된 것이 아닌 경우). 올바른 소멸자는 –