2009-08-13 35 views
6

Estoy usando Qt y C++, necesito encontrar la cantidad de memoria utilizada por instancias de ciertas clases de Qt, esto usualmente se hace usando sizeof, sin embargo en Qt cada clase tiene un puntero a otra clase que contiene la implementación real, la definición de esta clase de implementación privada no se encuentra en los encabezados, sino solo en el código fuente.Obteniendo el tamaño de un Objeto Qt

Soy nuevo en Qt, entonces puede que haya una manera estándar de hacerlo, si no tiene alguna idea para resolver esto?

+6

¿Por qué crees que necesitas hacer esto? –

+1

Necesito saber si puedo crear miles de ellos o si el objeto es demasiado grande. –

+3

@Diaa: intente crearlos y compruebe correctamente si hay errores –

Respuesta

7

No hay una respuesta exacta a la pregunta, ya que la cantidad de memoria asignada para diferentes objetos del mismo tipo podría no ser la misma (por ejemplo, QSomething A podría reutilizar algunos datos de un caché, mientras que QSomething B podría tener para asignarlo por separado, etc.).

Lo que podría hacer, supongo, es escribir un programa de prueba trivial que se inicia, asigna N del objeto en cuestión, y luego se queda en reposo() durante mucho tiempo. Mientras el programa está durmiendo, use el Administrador de tareas (o la herramienta que prefiera) para ver cuánta RAM está usando el proceso. Luego ctrl-C (o matar) el proceso, y ejecutarlo de nuevo con un valor mayor para N, y repita la medición. Repita ese proceso y eventualmente obtendrá una idea de cómo crece la asignación de RAM del proceso con la cantidad de elementos asignados, y luego puede hacer un poco de álgebra para tener una idea aproximada del costo promedio de memoria por objeto.

(tenga en cuenta que hay un poco de sobrecarga de memoria al iniciar el proceso, restar la memoria utilizada por el caso N = 0 de todos los casos para que solo se midan los costos de los objetos y no la sobrecarga ambiental)

10

No hay forma de hacerlo en Standard C++, y muy pocos frameworks soportan algo parecido. La razón es bastante simple: como ha observado, un objeto puede contener punteros, y esos punteros pueden apuntar a otros objetos que contienen punteros, , etc. E incluso cuando llega al final de la cadena de punteros, no hay un método general para averiguar a cuánto apunta la memoria.

Por lo tanto, debe encontrar otra manera de resolver su problema, que no creo que sea el problema correcto para resolver en primer lugar.

5

El problema no es exclusivo de Qt, de hecho. Considere cuánto espacio usa un std::string. No es ni sizeof(std::string) ni std::string::size().

C++ no tiene una respuesta a esta pregunta porque la pregunta rara vez tiene sentido.

+2

Para std :: string, usando sizeof (std :: string) + la longitud de la cuerda le da un número casi correcto. Uno debe tener una indicación de qué tan pesado es un objeto para poder escribir aplicaciones eficientes. Me parece extraño que una pregunta como esta rara vez tenga sentido en un lenguaje que permita la programación de bajo nivel y le brinde un control absoluto. –

+1

Por nombrar solo algunas razones, no es tan confiable: optimización de cadenas pequeñas, redondeo de tamaño, sobrecarga del montón, VACA. En su segunda observación, todavía no he encontrado una situación en la que la falta de esta información me haya impedido. – MSalters

+0

@Diaa Le otorga control absoluto, pero si lo desea, no puede usar bibliotecas como Qt o, de hecho, la Biblioteca estándar; debe escribir la suya propia. Pero el hecho de que ninguna de estas bibliotecas proporcione la función sobre la que pregunta su pregunta debería sugerirle que no es una función particularmente útil de implementar. –

3

He encontrado que, en general, QObject es bastante pesado para crear más de unos pocos miles de instancias.

Como han mencionado otras personas, a menudo la mejor forma de resolver esto es probarlo y ver qué pasa. Incluso se podría escribir una pequeña aplicación como esta:

int main(int argc, char **argv) 
{ 
    QApplication app(argc, argv); 
    QObject objects[5000]; 
    return app.exec(); 
} 

A continuación, medir el uso de la memoria antes de salir de la aplicación.

Cuestiones relacionadas