2014-11-25 7 views
1

벡터 myVec로 찍은 메모리 (정적 및 동적)를 계산해야합니다. 나는 내가 무엇을했는지가 정확한지 여부를 알 필요가 벡터의 크기를 계산하는 방법

size = sizeof(myVec) * myVec.size(); 

방식

다음 크기를 계산 한 ?

struct S1 
{ 
    vector<int> v1; 
    IplImage* image; 
    vector<CvRect> rect; 
}; 

struct S2 
{ 
    vector<S1> var1; 
    vector<int> var2; 
    IplImage* img1; 
}; 

vector<S2> myVec; 


//size = sizeof(myVec) * myVec.size(); ????? 
+0

정적 또는 동적 메모리? – soon

+0

정적 및 동적 – Deepak

+0

'sizeof (myVec)'는 요소의 크기를 가져올만큼 충분하지 않습니까? ??? – Xlander

답변

2

(@enhzflep가 주석에서 지적했듯이).

그러나 실제로 그렇게해야하는 경우 컨테이너에 저장할 유형을 알고 있으면 템플릿을 사용하여 최종 알고리즘을 조합 할 수 있습니다. 즉,의 라인을 따라 뭔가 :

template<typename T> 
unsigned get_size(const T& val) { 
    return compute_size<T>::of(val); 
} 

같은 것으로 선도 :

// for PODs we don't really have to iterate 
template<> 
struct compute_size<std::vector<int>> { 
    static unsigned of(const std::vector<int>& v) { 
     return sizeof(v) + v.capacity() * sizeof(int); 
    } 
};  
: 같은 몇 가지 가능한 최적화와

std::vector<std::string> qqq; 
qqq.push_back("asdfasdf"); 
qqq.push_back("qwer"); 
std::cout << get_size(qqq) << std::endl; 

함수 템플릿을 통해 사용

template<typename T> 
struct compute_size { 
    static unsigned of(const T& t) { 
     assert(false && "not implemented"); 
     return 0; 
    } 
}; 

template<typename T> 
struct compute_size<std::vector<T>> { 
    static unsigned of(const std::vector<T>& v) { 
     // static size 
     unsigned result = sizeof(std::vector<T>); 
     // static and dynamic size of all used elements 
     for(auto& i : v) 
      result += compute_size<T>::of(i); 
     // account for allocated empty space 
     result += (v.capacity() - v.size()) * sizeof(T); 

     return result; 
    } 
}; 

template<> 
struct compute_size<int> { 
    static unsigned of(const int&) { 
     return sizeof(int); 
    } 
}; 

template<> 
struct compute_size<std::string> { 
    static unsigned of(const std::string& s) { 
     return sizeof(std::string) + s.capacity() * sizeof(std::string::value_type); 
    } 
}; 

그리고 아마도, std::enable_if을 사용하여 이것을 전체 유형 그룹으로 일반화합니다.

+0

숙제 문제에 답하지 않길 바란다 ... –

+0

위의 코드를 컴파일하는 동안 getmem.cpp를 컴파일하는 동안 다음과 같은 오류가 발생합니다. 4 : 22 : 오류 : '<'토큰 앞에 예상 된 이니셜 라이저 – Deepak

+0

무엇인지 알고 싶습니다. on line 4 of your code :)하지만 코드가 컴파일되지 않는다. 함수의 부분적인 특수화는 여전히 허용되지 않는다. 나는 대답을 고쳐 줄 것이다. –

0

정적 크기 : sizeof(vector<S2>)

동적 크기 : 각 인스턴스는 자신의 내부 메모리를 할당 할 함유 때문에 쉽게 ++ C의 콘테이너의 정적 및 동적 크기를 모두 결정할 수 myVec.capacity() * sizeof(S2)

+3

Nope. 'S2'가'std :: string' 일 때 코드를 사용해보십시오. 힌트 : 결과는 문자열의 ptr 크기 * 요소의 수입니다. 즉 "문자열 인덱스 0"을 보유하는 문자열 객체를 포함하는 1 요소 벡터는 4 (동적 크기)의 출력을 생성합니다. – enhzflep

+0

@enhzflep'std :: string'의 동적 크기를 포함하지 않는다는 것을 의미합니까? – songyuanyao

+1

그래, 맞아. 이것을보십시오 :'typedef vector vecStr; vecStr myVec; myVec.push_back ("이것은 요소 0입니다."); cout << "memory consumed :"<< myVec.capacity() * sizeof (string) << "bytes". << endl;'(x64 win7 시스템의 32 비트 프로그램에서) 결과는 4입니다. – enhzflep

관련 문제