2010-12-22 14 views
6

Estoy tratando de determinar el tamaño de un objeto en tiempo de ejecución. sizeof no funciona porque devuelve el tamaño en tiempo de compilación. Aquí está un ejemplo de lo que quiero decir:Cómo determinar la memoria de un objeto C++ en tiempo de ejecución

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

private: 
    char *c; 
}; 

En este caso, sizeof(Foo) será de 4 bytes y no ~ 1 GB. ¿Cómo puedo determinar el tamaño de Foo en tiempo de ejecución? Gracias por adelantado.

+1

posible duplicado de [Si free() conoce la longitud de mi matriz, ¿por qué no puedo solicitarla en mi propio código?] (Http://stackoverflow.com/questions/2650895/if-free-knows -the-length-of-my-array-why-cant-i-ask-it-it-in-my-own-code) –

+2

Es posible que desee distinguir el tamaño del objeto de la cantidad de memoria controlada por el objeto. La asignación que está configurando 'c' para señalar * nunca * será parte del objeto en sí. Los objetos de la clase 'Foo' serán todos del mismo tamaño (que será del tamaño de un puntero de datos en el ejemplo anterior). Esto es un poco pedante, pero ... – dmckee

+0

'sizeof no funciona porque esto devuelve el tamaño en tiempo de compilación. - en realidad no. A veces hay un tamaño de tiempo de ejecución, especialmente en C99 y GCC. (http://stackoverflow.com/questions/2615203/is-sizeof-in-c-evaluated-at-compilation-time-or-run-time/2709634#2709634) – osgx

Respuesta

5

Tiene que hacer un seguimiento de usted mismo de alguna manera. Por ejemplo:

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

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

en cuenta que debe utilizar un recipiente puntero inteligente para la gestión de objetos asignados dinámicamente para que no tenga que manejar sus vidas de forma manual. Aquí, he demostrado el uso de scoped_array, que es un contenedor muy útil. También puede usar shared_array o usar shared_ptr con un eliminador personalizado.

+0

Esta es una gran respuesta. Sin embargo, estoy intentando determinar el uso de memoria de los objetos que no he escrito. Específicamente, stl string, stl wstring y ICU UnicodeString todo poblado con los mismos datos. Cada uno tiene funciones que devuelven el tamaño del búfer interno pero no el tamaño del objeto completo. Para complicar el problema, estos objetos podrían contener punteros a otros datos. ¿Algunas ideas? –

+0

@Dr. Jay: Puedes estimar, pero es lo mejor que puedes hacer. Para un 'std :: string' o un' std :: wstring', puede obtener 's.size()' para encontrar el tamaño del búfer que tienen (tenga en cuenta que está en caracteres, por lo que tendrá que multiplicar el resultado de 'wstring' por' sizeof (wchar_t) 'para obtener el tamaño en bytes) y agregarlo al tamaño del objeto' sizeof (s) '. Para otros tipos, deberá averiguar si exponen el tamaño de lo que contienen. De todos modos, es solo una estimación, ya que los búferes subyacentes pueden ser más grandes (por ejemplo, para 'vector',' v.capacity() 'puede ser mayor que' v.size() '). –

5

El tamaño de Foo es constante. Los ~ 1GB de caracteres no pertenecen técnicamente al objeto, solo el puntero a él. Se dice que los caracteres solo son propiedad del objeto, porque el objeto es responsable de asignar y desasignar la memoria para ellos. C++ no proporciona características que le permitan saber cuánta memoria ha asignado un objeto. Tienes que hacer un seguimiento de eso tú mismo.

1

El tamaño del objeto es 4 bytes en su sistema. El objeto, sin embargo, utiliza recursos adicionales, como 1 GB de memoria.

Cuestiones relacionadas