2009-08-13 1 views
6

J'utilise Qt et C++, j'ai besoin de connaître la quantité de mémoire utilisée par les instances de certaines classes Qt, ceci est généralement fait en utilisant sizeof, mais en Qt, chaque classe contient un pointeur à une autre classe contenant l'implémentation réelle, la définition de cette classe d'implémentation privée n'est pas trouvée dans les en-têtes mais seulement dans le code source.Obtenir la taille d'un objet Qt

Je suis nouveau sur Qt, il se peut qu'il existe une façon standard de le faire, si vous n'avez pas d'idées pour résoudre ce problème?

+6

Pourquoi pensez-vous que vous devez faire cela? –

+1

J'ai besoin de savoir si je peux en créer des milliers ou si l'objet est trop gros. –

+3

@Diaa: juste essayer de les créer, et vérifier correctement les erreurs –

Répondre

7

Il n'y a pas de réponse exacte à la question, car la quantité de mémoire allouée aux différents objets du même type peut ne pas être la même (par exemple QQuelquechose A pourrait être capable de réutiliser certaines données d'un cache l'allouer séparément, etc.). Ce que vous pourriez faire, je suppose, est d'écrire un programme de test trivial qui démarre, alloue N de l'objet en question, puis passe à sleep() pendant une longue période. Pendant que le programme est en veille, utilisez le Gestionnaire des tâches (ou quel que soit l'outil que vous préférez) pour voir la quantité de RAM utilisée par le processus. Puis Ctrl-C (ou tuer) le processus, et exécutez-le à nouveau avec une valeur plus grande pour N, et répétez la mesure. Répétez ce processus et finalement vous aurez une idée de l'augmentation de l'allocation RAM du processus avec le nombre d'éléments alloués, et ensuite vous pouvez faire une petite algèbre pour avoir une idée approximative du coût moyen de la mémoire par objet. (Gardez à l'esprit qu'il y a une bonne surcharge de mémoire juste au démarrage du processus, donc soustrayez la mémoire utilisée par le cas N = 0 de tous les cas de sorte que vous mesurez seulement les coûts des objets et non le surcoût environnemental)

10

Il n'y a aucun moyen de le faire en Standard C++, et très peu de frameworks supportent quelque chose comme ça. La raison est assez simple - comme vous l'avez remarqué, un objet peut contenir des pointeurs, et ces pointeurs peuvent pointer vers d'autres objets contenant des pointeurs, et ainsi de suite. Et même lorsque vous arrivez à la fin de la chaîne du pointeur, il n'y a pas de méthode générale pour déterminer la quantité de mémoire vers laquelle un pointeur pointe. Donc, vous devez trouver un autre moyen de résoudre votre problème, ce qui ne me semble pas être le bon problème à résoudre en premier lieu.

5

Le problème n'est pas unique à Qt, en fait. Considérez combien d'espace utilise un std::string. Ce n'est ni sizeof(std::string) ni std::string::size().

C++ n'a pas de réponse à cette question car la question a rarement un sens.

+2

Pour std :: string, en utilisant sizeof (std :: string) + la longueur de la chaîne vous donne un nombre presque correct. On devrait avoir une indication de la lourdeur d'un objet pour être capable d'écrire des applications efficaces. Je trouve étrange qu'une telle question ait rarement un sens dans un langage qui permet une programmation de bas niveau et vous donne un contrôle absolu. –

+1

Pour ne nommer que quelques raisons, ce n'est pas si fiable: petite optimisation de la chaîne, l'arrondi de la taille, surcharge de tas, COW. Avec votre deuxième remarque, je n'ai pas encore rencontré une situation dans laquelle l'absence de cette information me gênait. – MSalters

+0

@Diaa Cela vous donne un contrôle absolu, mais si vous le souhaitez, vous ne pouvez pas utiliser des bibliothèques comme Qt ou bien la bibliothèque standard - vous devez écrire les vôtres. Mais le fait qu'aucune de ces bibliothèques n'offre la fonctionnalité demandée par votre question devrait vous suggérer que ce n'est pas une fonctionnalité particulièrement utile à mettre en œuvre. –

3

J'ai trouvé qu'en général QObject est assez lourd pour créer plus de quelques milliers d'instances.

Comme plusieurs autres personnes l'ont mentionné, souvent, la meilleure façon d'y arriver est de l'essayer et de voir ce qui se passe. Vous pouvez même écrire une petite application comme ceci:

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

Ensuite, mesurez l'utilisation de la mémoire avant de quitter l'application.