2010-12-22 6 views
6

런타임에 객체의 크기를 확인하려고합니다. sizeof는 컴파일 타임에 크기를 반환하기 때문에 작동하지 않습니다. 여기에 내가 무엇을 의미하는지의 예입니다런타임시 C++ 객체의 메모리를 확인하는 방법

class Foo 
{ 
public: 
    Foo() 
    { 
     c = new char[1024*1024*1024]; 
    } 
    ~Foo() 
    { 
     delete[] c; 
    } 

private: 
    char *c; 
}; 

이 경우는, sizeof(Foo)는 4 바이트가 아닌 ~ 1기가바이트 될 것입니다. 런타임에 Foo의 크기를 어떻게 결정합니까? 미리 감사드립니다.

+1

가능한 복제본 [free()가 배열의 길이를 알고 있다면 왜 내 코드에서 요청할 수 없습니까?] (http://stackoverflow.com/questions/2650895/if-free-knows) 배열 길이 - 왜 - 내 - 자기 - 코드 - 왜 - 내 - 자체 - 코드 -) - –

+2

에 의해 제어되는 메모리의 양을 개체의 크기를 구별 할 수 있습니다. 목적. 'c '를 가리키는 설정은 결코 객체 자체의 일부가 될 수 없습니다. 'Foo' 클래스의 객체는 모두 같은 크기입니다 (위의 예제에서 데이터 포인터의 크기입니다). 이것은 약간의 의미는 있지만 ... – dmckee

+0

'컴파일 타임에 크기를 반환하기 때문에 sizeof가 작동하지 않습니다. '- 실제로 없습니다. 때로는 C99 및 GCC에서 런타임 sizeofs가 있습니다. (http://stackoverflow.com/questions/2615203/is-sizeof-in-c-evaluated-at-compilation-time-or-run-time/2709634#2709634) – osgx

답변

5

당신은 어떻게 든 그것을 추적해야합니다. 예를 들어 사용자가 수동으로 자신의 수명을 관리 할 필요가 없습니다 있도록 동적으로 할당 된 객체를 관리하는 스마트 포인터의 컨테이너를 사용한다

struct Foo 
{ 
    Foo() 
     : elements(1024 * 1024 * 1024) 
    { 
     c.reset(new char[elements]); 
    } 

    boost::scoped_array<char> c; 
    int elements; 
}; 

참고. 여기서는 매우 유용한 컨테이너 인 scoped_array의 사용을 시연했습니다. shared_array을 사용하거나 shared_ptr을 맞춤 삭제 프로그램과 함께 사용할 수도 있습니다.

+0

좋은 답변입니다. 그러나 필자가 작성하지 않은 객체의 메모리 사용량을 확인하려고 시도하고 있습니다. 특히, stl string, stl wstring 및 ICU UnicodeString은 모두 동일한 데이터로 채워집니다. 각 함수는 내부 버퍼의 크기를 반환하지만 전체 객체의 크기는 반환하지 않습니다. 문제가 복잡해지면이 객체에는 다른 데이터에 대한 포인터가 포함될 수 있습니다. 어떤 아이디어? –

+0

@Dr. Jay : 예상 할 수는 있지만 할 수있는 최선의 방법입니다. 'std :: string' 또는'std :: wstring'에 대해서's.size()'를 사용하여 버퍼의 크기를 알아낼 수 있습니다 (문자로되어 있으므로 곱해야합니다). 크기를 바이트 단위로 얻으려면'sizeof (wchar_t) '에 의한'wstring'의 결과)를 sizeof (s) 객체의 크기에 더합니다. 다른 유형의 경우, 포함 된 항목의 크기가 공개되는지 여부를 알아야합니다. 어쨌든, 기본 버퍼가 더 클 수 있습니다 (예 :'vector','v.capacity()'는'v.size()'보다 클 수 있습니다). –

5

Foo의 크기는 일정합니다. ~ 1 기가 바이트의 문자는 기술적으로 개체에 속하지 않으며 개체에 대한 포인터입니다. char은 객체가 소유하고 있다고 말합니다. 왜냐하면 객체가 객체에 대한 메모리 할당 및 할당 해제를 담당하기 때문입니다. C++은 객체가 할당 한 메모리의 양을 알아낼 수있는 기능을 제공하지 않습니다. 너 자신을 추적해야 해.

1

의 크기는 시스템에서 4 바이트입니다. 그러나 개체는 1GB의 메모리와 같은 추가 리소스를 사용합니다.

관련 문제