7
votes

(C ++) à la recherche de conseils pour réduire l'utilisation de la mémoire

J'ai un problème avec une limite de mémoire vraiment serrée et difficile. Je suis un geek CPP et je veux réduire mon utilisation de la mémoire. S'il vous plaît donnez-moi des conseils.


Un de mes amis a recommandé de prendre des fonctions dans mes structures en dehors d'eux. Par exemple, au lieu d'utiliser: p>

  int start;
  int end;
  bool flag;
  node* left;
  node* right;


11 commentaires

Que fait votre programme? Quels algorithmes utilisent-t-il? Il est difficile de parler d'optimisations en termes généraux.


Si vous êtes sous Linux, vous pouvez utiliser Valgrind / Massif pour voir où se passe votre tas


Le remplacement des fonctions des membres avec des fonctions libres n'affectera pas la taille du code au moindre. Cependant, il sera plus facile de faire des erreurs comme passer de la valeur plutôt que de la référence.


Pouvez-vous indiquer l'URL du problème? Ou peut-être plus de code? Sinon, n'ayant aucune perte de mémoire / aucun nœud supplémentaire créé les seules choses que vous pouvez effectuer est d'utiliser court au lieu de int mais cela dépend de la taille du problème ..


@ Loïc Février: Ce n'est pas un problème public. Mais voici un problème similaire et plus facile: z-trening.com/tasks.php? show_task = 5000000081


@ user12345: C'est le même problème? Quel est le nombre de "cartes" dans votre cas?


La taille d'entrée est la même. Le problème est légèrement différent mais la différence est dans son temps pas la taille et je la résout en moins de 0,7 seconde.


L'arbre est un binaire? Ensuite, vous n'avez pas besoin de vos nœuds, utilisez simplement des tableaux pour stocker vos informations. Compte tenu d'un nœud i les enfants sont 2i et 2i + 1 . Vous n'avez pas besoin de vos deux pointeurs.


Utilisez-vous une récursion sur le code ou le passage des données par copie au lieu de vous référer?


Vous avez raison. Si stupide de moi.


@ user12345: Une fois que vous aurez changé votre code pourriez-vous nous dire à quel point l'utilisation de la mémoire est faible?


7 Réponses :


9
votes

Non, les fonctions de membre régulières ne font pas la classe ou la structure plus grandes. Présentation d'une fonction peut (sur de nombreuses plateformes) Ajoutez un POINTER TVTABLE à la classe. Sur x86 qui augmenterait la taille par quatre octets. Plus aucune mémoire ne sera requise lorsque vous ajoutez des fonctions virtuelles, mais - un pointeur suffit. La taille d'un type de classe ou de structure n'est jamais nulle (indépendamment de la totalité des variables de membre ou des fonctions virtuelles). C'est pour vous assurer que chaque instance occupe son propre espace mémoire ( source , section 9.0.3).


3 commentaires

Merci. Et avez-vous des suggestions?


User12345: Je ne le fais pas, car comme Nick Meyer a souligné dans un commentaire à votre poste, il est difficile de discuter d'une optimisation de l'utilisation de la mémoire en général. Tu dois être plus précis.


Merci quand même. C'était une bonne aide.




5
votes

À mon avis, le meilleur moyen de réduire la mémoire consiste à considérer votre compréhension de l'espace algorithmique au lieu de simplement faire des optimisations de code fines. Reconsidérer des choses comme des tables de programmation dynamiques, des copies inutiles, généralement toute chose qui est discutable en termes d'efficacité de la mémoire. Essayez également de libérer des ressources de mémoire tôt chaque fois qu'elles ne sont plus nécessaires.


0 commentaires


0
votes

Les deux possibilités ne sont pas du tout équivalentes:


0 commentaires

0
votes

Comme d'autres l'ont dit, avoir des méthodes n'augmente pas la taille de la structure à moins que l'une d'entre elles est virtuelle.

Vous pouvez utiliser des champs de bit pour compresser efficacement les données (ceci est particulièrement efficace avec votre booléen ...). En outre, vous pouvez utiliser des indices au lieu des pointeurs, pour sauver quelques octets.

N'oubliez pas d'allouer vos nœuds dans de gros morceaux plutôt que de manière individuelle (par exemple, à l'aide de nouvelles [] une fois, pas régulièrement de plusieurs fois) pour éviter la gestion de la mémoire.

Si vous n'avez pas besoin de la pleine flexibilité, vos pointeurs de nœud fournissent, vous pourrez peut-être les réduire ou les éliminer. Par exemple, Heapsort a toujours un arbre binaire presque complet. La mise en œuvre standard utilise donc un arbre implicite, qui n'a pas besoin de pointeurs du tout.

Surtout surtout, trouver un algorithme différent peut changer complètement le jeu ...


0 commentaires

1
votes

Pour votre exemple final (l'arborescence), vous pouvez utiliser un hack intelligent avec XOR pour remplacer les deux pointeurs de nœud avec un seul pointeur de nœud, comme décrit ici . Cela ne fonctionne que si vous parcourez l'arborescence dans le bon ordre, cependant. Évidemment, cela fait mal la lisibilité du code, alors devrait être une autre recours.


1 commentaires

Merci pour ce lien .. Intéressant, je souhaite y avoir pensé quand je codérissait pour des contraintes de mémoire très très étroites avec des systèmes embarqués.