6
votes

Obtenir la taille d'un objet QT

J'utilise QT et C ++, je dois trouver la quantité de mémoire utilisée par des cas de certaines classes Qt, ceci est généralement effectué à l'aide de Taimof, cependant dans QT chaque classe contient un pointeur sur une autre classe contenant le réel Mise en œuvre, la définition de cette classe de mise en œuvre privée n'est pas trouvée dans les en-têtes mais uniquement dans le code source.

Je suis nouveau à Qt, donc peut-être qu'il y a une façon standard de le faire, s'il n'y a pas de idées pour résoudre ce problème?


5 commentaires

Pourquoi pensez-vous que vous devez faire cela?


J'ai besoin de savoir si je peux créer des milliers d'autres ou que l'objet est trop grand.


@Diaa: Essayez simplement de les créer et cochez correctement les erreurs


Stackoverflow.com/questions/15763088/...


@anon Certaines personnes n'ont pas de mémoire illimitée et doivent considérer cela et ne pas écrire de code ballonné. QOBJECT ajoute de belles fonctionnalités mais ne vaut pas la peine si nous cauchons le tueur Oom


4 Réponses :


10
votes

Il n'y a aucun moyen de le faire en standard C ++ et très peu de cadres soutiennent quoi que ce soit comme celui-ci. La raison est assez simple - comme vous l'avez observée, un objet peut contenir des pointeurs et ces pointeurs peuvent indiquer d'autres objets contenant des pointeurs, etc. Et même lorsque vous arrivez à la fin de la chaîne de pointeur, il n'y a pas de méthode générale pour savoir la quantité de mémoire qu'un pointeur pointe.

Donc, vous devez trouver un autre moyen de résoudre votre problème, ce que je ne crois pas est le bon problème de résoudre en premier lieu.


0 commentaires

7
votes

Il n'y a pas de réponse exacte à la question, car la quantité de mémoire allouée pour différents objets du même type pourrait même ne pas être identique (par exemple, QSomethanit peut être capable de réutiliser certaines données d'un cache alors que QSomethant a peut-être besoin de allouer séparément, etc.).

Ce que vous pouviez faire, je suppose, est d'écrire un programme de test trivial qui démarre, alloue n de l'objet en question, puis se rend à votre disposition () pendant une longue période. Bien que le programme dort, utilisez le gestionnaire de tâches (ou tout autre outil que vous préférez) pour voir la quantité de RAM Le processus utilise. Ensuite, CTRL-C (ou tuez) le processus et exécutez-le à nouveau avec une valeur plus grande pour N et répétez la mesure. Répétez cette procédure et finalement, vous aurez une idée de la manière dont l'allocation de RAM du processus augmente avec le nombre d'éléments alloués, puis vous pouvez faire une petite algèbre pour obtenir une idée de ballon de la mémoire moyenne de la mémoire par objet.

(Gardez à l'esprit qu'il y a un bon bit de mémoire au-dessus de la mémoire juste dans le démarrage du processus, alors soustrayez la mémoire utilisée par le boîtier N = 0 de tous les cas afin de mesurer uniquement les coûts des objets et non le frais généraux environnementaux)


0 commentaires

5
votes

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

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


4 commentaires

Pour STD :: String, en utilisant Taillef (STD :: String) + La longueur de la chaîne vous donne un numéro presque correct. Il faut indiquer comment un objet lourd est de pouvoir écrire des applications efficaces. Je trouve étrange qu'une telle question ait rarement un sens dans une langue qui permet une programmation de bas niveau et vous donne un contrôle absolu.


Nommer juste quelques raisons, ce n'est pas si fiable: l'optimisation de petite chaîne, l'arrondi de taille, les frais de tas, la vache. WRT votre deuxième remarque, je n'ai pas encore rencontré une situation dans laquelle le manque de cette information m'a entravé.


@Diaa Il vous donne un contrôle absolu, mais si vous le souhaitez, vous ne pouvez pas utiliser de bibliothèques comme QT ou en effet la bibliothèque standard - vous devez écrire votre propre. Mais le fait qu'aucune de ces bibliothèques ne fournit la fonctionnalité que votre question pose de vous suggère de vous suggérer qu'il n'est pas une fonctionnalité particulièrement utile à mettre en œuvre.


@Neil, @msalters Merci pour vos réponses, je comprends votre point de vue mais je ne suis pas convaincu. J'aimerais en discuter plus, mais les commentaires ne sont pas très appropriés pour cela.



2
votes

J'ai constaté que, dans General QObject, est plutôt lourde pour créer plus de quelques milliers d'instances.

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

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


1 commentaires

L'utilisation de la mémoire d'application n'est pas reflétée sur la pile, car la pile est déjà une pièce de mémoire préalablement allouée. De plus, cela ne vous donnera pas la taille réelle de QObject, juste la taille de la coquille de l'objet, que vous pouvez facilement et bien plus précisément avec la taille de toute façon ...